2

我实现了一个 WCF SOAP 服务(.Net 4),并从 Eclipse 中的 Android 模拟器调用该服务。我的服务作为 Web 应用程序部署在 IIS 7 中。android 上的 Web 服务客户端使用 SOAP 消息执行 HTTP POST。

当我通过 Eclipse 从 android 模拟器调用 Web 服务时,我得到了 FileNotFoundException。错误输入流给了我以下异常:

<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>
</BODY></HTML>

当我从 wcftestclient 调用我的 SOAP Web 服务时,请求被成功处理。此外,当我从 Android 模拟器客户端使用 Apache common tcpmon 时,成功处理了 SOAP Web 服务请求。

只有当我将 Android 模拟器设置为直接访问 WCF SOAP Web 服务时,我才会收到此异常。我已将 WCF SOAP Web 服务配置为 IIS 中的网站,并通过 IP 地址/端口 ( http://<myIPAddress>:<myPortNumber>/MyService.svc?wsdl) 访问它。

我在我的 Android 客户端中设置我的 HttopURLConnection 如下:

connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
connection.setRequestProperty("SOAPAction", this.getSOAPAction());
connection.setRequestProperty("Host", "base_urlforwebservices like - xyz.net");
connection.setRequestProperty("Accept-Encoding", "None");
connection.setRequestProperty("Connection", "close");
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("User-Agent", "android");

我尝试取出setDoOutput(true)setDoInput(true)尝试在连接属性中设置授权凭据:

connection.setRequestProperty("Authorization", "Basic " + Base64.encodeToString(userCredentials.getBytes(), Base64.DEFAULT));

它没有任何区别。

在我的 Android.manifest 文件中,我添加了以下设置:

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

但这也没有什么不同。

非常感谢您对此的任何帮助。谢谢!

4

1 回答 1

0

你从 Visual Studio 运行 WCF 吗?如果是这样,它仅限于本地主机,有两种解决方案:

  1. 如果从 Visual Studio 记事本 %USERPROFILE%\My Documents\IISExpress\config\applicationhost.config 并将绑定从 for eaxmpe ":21433:localhost" 更改为 ":21422:" 现在您应该可以从 android (10.0 .2.2)

  2. 将 WCF 服务部署到 IIS

  3. mae localhost(pc) 上的代理,并在目标下的 android 运行配置中使用 --http-proxy

于 2013-05-25T21:05:32.373 回答