0

我访问 wcf Web 服务的代码在 android 应用程序中不起作用:

在顶部我有:

private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://10.86.164.102/ABCWcfService/ABCWcfService.svc";
private static final String SOAP_ACTION = "http://tempuri.org/IABCWcfService/GetTitle";
private static final String METHOD_NAME = "GetTitle";

然后在我的方法中:

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug = true;

try
{
    androidHttpTransport.call(SOAP_ACTION, envelope);
    SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
    String receivedString = result.toString();
}
catch (Exception e)
{
}

我发现它在 androidHttpTransport.call(SOAP_ACTION,envelope); 但 e 的值为 null。

我在 Java 项目中使用相同的代码来访问相同的 wcf Web 服务,并且工作正常。

我确实添加了:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-sdk android:minSdkVersion="8" />
<application>
     ....
</application>

在清单文件中,在应用程序部分之前。但仍然无法正常工作。

我在互联网上阅读了很多不同的主题。他们都没有解决我的问题。有人有更好的建议吗?谢谢你。

Web 服务与 android 应用程序在同一台机器上运行。

4

1 回答 1

0

我仍然有点困惑为什么你的异常是空的。您是否在设备上或仅在模拟器中尝试过?

可以在这个关于Exception always null的问题中解释为什么Exception e可能为 null的解释。简短的回答:模拟器可能不理解它收到的异常,可能会用 a代替实际的异常。null

您说 android 应用程序与 Web 服务在同一台机器上,所以当您在模拟器中运行它时,我读到了这一点,对吗?尝试在实际设备上运行它,看看设备日志中是否有有用的东西。

Log.e(TAG, "caught exception " + e);

如果您可以获得堆栈跟踪,解决此问题会容易得多。

该问题中的链接解决了有关在主线程上使用网络调用的问题。基本上从主线程进行网络调用是不好的做法,因为它会影响应用程序的响应性。对于某些 SDK 版本(API 级别大于 10,即 Honeycomb 及更高版本),NetworkOnMainThreadException将抛出 a 并且模拟器可能无法理解,因此替换为 null。

但是,对该问题的回答可能无法完全解释您所看到的内容,因为您的<uses-sdk>列表 aminSdkVersion值为 8。(不targetSdkVersion,但应该仍然可以。)

如果您可以获得堆栈跟踪,让我们看看我们是否可以找到更多信息。

于 2012-07-20T14:40:01.393 回答