无法连接到 Android 上的 WCF 服务 [英] Can't connect to WCF service on Android
问题描述
我正在尝试使用 kSOAP2 (v 2.1.2) 连接到 Android 中的 .NET WCF 服务,但是每当我尝试进行服务调用时,我总是收到致命异常.我在跟踪错误时遇到了一些困难,似乎无法弄清楚为什么会发生这种情况.我使用的代码如下:
I am trying to connect to a .NET WCF service in Android using kSOAP2 (v 2.1.2), but I keep getting a fatal exception whenever I try to make the service call. I'm having a bit of difficulty tracking down the error and can't seem to figure out why it's happening. The code I am using is below:
package org.example.android;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransport;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
public class ValidateUser extends Activity {
private static final String SOAP_ACTION = "http://tempuri.org/mobile/ValidateUser";
private static final String METHOD_NAME = "ValidateUser";
private static final String NAMESPACE = "http://tempuri.org/mobile/";
private static final String URL = "http://192.168.1.2:8002/WebService.Mobile.svc";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.validate_user);
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras == null) {
this.finish();
}
String username = extras.getString("username");
String password = extras.getString("password");
Boolean validUser = false;
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo uName = new PropertyInfo();
uName.name = "userName";
PropertyInfo pWord = new PropertyInfo();
pWord.name = "passWord";
request.addProperty(uName, username);
request.addProperty(pWord, password);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransport androidHttpTransport = new HttpTransport(URL);
androidHttpTransport.call(SOAP_ACTION, envelope); // error occurs here
Integer userId = (Integer)envelope.getResponse();
validUser = (userId != 0);
} catch (Exception ex) {
}
}
private void exit () {
this.finish();
}
}
删除旧的堆栈跟踪.总之,第一个问题是由于使用 vanilla kSOAP2 而不是 Android 的修改库 (kSOAP2-Android) 导致缺少方法或库,导致程序无法打开连接.第二个问题是设置问题.在 Manifest 中我没有添加以下设置:
Remove the old stack traces. In summary, the first problem was the program being unable to open a connection due to missing methods or libraries due to using vanilla kSOAP2 rather than a modified library for Android (kSOAP2-Android). The second issue was a settings issue. In the Manifest I did not add the following setting:
<uses-permission android:name="android.permission.INTERNET" />
我现在遇到了 XMLPullParser 的问题,我需要弄清楚.
I am now having an issue with the XMLPullParser which I need to figure out.
12-23 10:58:06.480:错误/SOCKETLOG(210):add_recv_stats接收0
12-23 10:58:06.480: ERROR/SOCKETLOG(210): add_recv_stats recv 0
12-23 10:58:06.710:警告/系统错误(210):org.xmlpull.v1.XmlPullParserException:意外类型(位置:END_DOCUMENTnull@1:0 在java.io.InputStreamReader@433fb070)
12-23 10:58:06.710: WARN/System.err(210): org.xmlpull.v1.XmlPullParserException: unexpected type (position:END_DOCUMENT null@1:0 in java.io.InputStreamReader@433fb070)
12-23 10:58:06.710:警告/系统错误(210):在org.kxml2.io.KXmlParser.exception(KXmlParser.java:243)
12-23 10:58:06.710: WARN/System.err(210): at org.kxml2.io.KXmlParser.exception(KXmlParser.java:243)
12-23 10:58:06.720:警告/系统错误(210):在org.kxml2.io.KXmlParser.nextTag(KXmlParser.java:1363)
12-23 10:58:06.720: WARN/System.err(210): at org.kxml2.io.KXmlParser.nextTag(KXmlParser.java:1363)
12-23 10:58:06.720:警告/系统错误(210):在org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:126)
12-23 10:58:06.720: WARN/System.err(210): at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:126)
12-23 10:58:06.720:警告/系统错误(210):在org.ksoap2.transport.Transport.parseResponse(Transport.java:63)
12-23 10:58:06.720: WARN/System.err(210): at org.ksoap2.transport.Transport.parseResponse(Transport.java:63)
12-23 10:58:06.720:警告/系统错误(210):在org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:100)
12-23 10:58:06.720: WARN/System.err(210): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:100)
12-23 10:58:06.730:警告/系统错误(210):在org.example.android.ValidateUser.onCreate(ValidateUser.java:68)
12-23 10:58:06.730: WARN/System.err(210): at org.example.android.ValidateUser.onCreate(ValidateUser.java:68)
12-23 10:58:06.730:警告/系统错误(210):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1122)
12-23 10:58:06.730: WARN/System.err(210): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1122)
12-23 10:58:06.730:警告/系统错误(210):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2104)
12-23 10:58:06.730: WARN/System.err(210): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2104)
12-23 10:58:06.730:警告/系统错误(210):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2157)
12-23 10:58:06.730: WARN/System.err(210): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2157)
12-23 10:58:06.730:警告/系统错误(210):在android.app.ActivityThread.access$1800(ActivityThread.java:112)
12-23 10:58:06.730: WARN/System.err(210): at android.app.ActivityThread.access$1800(ActivityThread.java:112)
12-23 10:58:06.730:警告/系统错误(210):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1581)
12-23 10:58:06.730: WARN/System.err(210): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1581)
12-23 10:58:06.730:警告/系统错误(210):在android.os.Handler.dispatchMessage(Handler.java:88)
12-23 10:58:06.730: WARN/System.err(210): at android.os.Handler.dispatchMessage(Handler.java:88)
12-23 10:58:06.730:警告/系统错误(210):在android.os.Looper.loop(Looper.java:123)
12-23 10:58:06.730: WARN/System.err(210): at android.os.Looper.loop(Looper.java:123)
12-23 10:58:06.730:警告/系统错误(210):在android.app.ActivityThread.main(ActivityThread.java:3739)
12-23 10:58:06.730: WARN/System.err(210): at android.app.ActivityThread.main(ActivityThread.java:3739)
12-23 10:58:06.730:警告/系统错误(210):在java.lang.reflect.Method.invokeNative(原生方法)
12-23 10:58:06.730: WARN/System.err(210): at java.lang.reflect.Method.invokeNative(Native Method)
12-23 10:58:06.730:警告/系统错误(210):在java.lang.reflect.Method.invoke(Method.java:515)
12-23 10:58:06.730: WARN/System.err(210): at java.lang.reflect.Method.invoke(Method.java:515)
12-23 10:58:06.730:警告/系统错误(210):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
12-23 10:58:06.730: WARN/System.err(210): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
12-23 10:58:06.730:警告/系统错误(210):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)
12-23 10:58:06.730: WARN/System.err(210): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)
12-23 10:58:06.730:警告/系统错误(210):在dalvik.system.NativeStart.main(本机方法)
12-23 10:58:06.730: WARN/System.err(210): at dalvik.system.NativeStart.main(Native Method)
推荐答案
让这个工作.清单文件存在上面提到的一些问题.此外,NAMESPACE、SOAP_ACTION 和 URL 参数不正确.NAMESPACE 需要在其前面加上uri:",SOAP_ACTION 也是如此.URL 需要指定端点,而不是 http://192.168.1.2:8002/WebService.Mobile.svc 它需要是 http://192.168.1.2:8002/WebService.Mobile.svc/Mobile.连接问题解决了,现在只需要弄清楚数据传输的事情.
Got this working. There were some issues as mentioned above with the Manifest file. On top of that the NAMESPACE, SOAP_ACTION, and URL parameters were incorrect. The NAMESPACE required "uri:" to be pre-pended to it, as did SOAP_ACTION. The URL needed to have an endpoint specified so instead of http://192.168.1.2:8002/WebService.Mobile.svc it needed to be http://192.168.1.2:8002/WebService.Mobile.svc/Mobile. Connection issues resolved, just need to figure out the data transport thing now.
这篇关于无法连接到 Android 上的 WCF 服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!