我实现了一个 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"/>
但这也没有什么不同。
非常感谢您对此的任何帮助。谢谢!