我正在为WCF服务开发Android客户端。有一个Windows应用程序与服务一起使用没有任何问题。但是,当我尝试在Android上使用服务时,使用kSoap2 - 我得到500内部服务器错误。显然我做错了但却无法弄清楚是什么。
这是我的Java代码:
// SOAP consts
private static final String NAMESPACE = "http://tempuri.org/";
private static final String SERVICE_NAME = "/SignService";
private static final String SOAP_ACTION = "http://tempuri.org/ISignService/";
...
String url;
String method_name = "GetExistedSignData";
url = mServerAddress + SERVICE_NAME;
/* the connect logic goes here */
try {
SoapObject request = new SoapObject(NAMESPACE, method_name);
request.addProperty("displayId", "HWI_00:1E:8C:87:7F:8D");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
envelope.dotNet = true;
//envelope.implicitTypes = true;
envelope.setAddAdornments(false);
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(url);
androidHttpTransport.call(method_name, envelope);
sb.append(envelope.toString() + "\n");
SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
//to get the data
String resultData = result.toString();
sb.append(resultData + "\n");
} catch (IOException e) {
sb.append("IO Problem:\n" + e.getMessage() + "\n");
} catch (XmlPullParserException e) {
sb.append("Parser Problem:\n" + e.getMessage() + "\n");
}
catch (Exception e) {
sb.append("Error:\n" + e.getMessage() + "\n");
}
以下是成功调用方法的Windows客户端的HTTP转储:
POST /SignService HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Host: ariadnetest.ariadne.vn
Content-Length: 995
Connection: Keep-Alive
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:r="http://schemas.xmlsoap.org/ws/2005/02/rm" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<r:Sequence s:mustUnderstand="1">
<r:Identifier>urn:uuid:b6073cc9-d142-4045-90cb-1ae8d839d400</r:Identifier>
<r:MessageNumber>1</r:MessageNumber>
</r:Sequence>
<a:Action s:mustUnderstand="1">http://tempuri.org/ISignService/GetExistedSignData</a:Action>
<a:MessageID>urn:uuid:ad89a2da-6205-460b-b50c-9b354d83594d</a:MessageID>
<ActivityId xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics" CorrelationId="9c91571d-e363-45da-ab5b-a83d48f3ec82">468b8556-f549-4d1f-969a-591aae05d4af</ActivityId>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">http://ariadnetest.ariadne.vn/SignService</a:To>
</s:Header>
<s:Body>
<GetExistedSignData xmlns="http://tempuri.org/">
<displayId>HWI_00:1E:8C:87:7F:8D</displayId>
</GetExistedSignData>
</s:Body>
</s:Envelope>
这是我的失败调用相同方法的HTTP转储:
POST /SignService HTTP/1.1
User-Agent: ksoap2-android/2.6.0+
Content-Type: application/soap+xml;charset=utf-8
Connection: close
Content-Length: 358
Host: ariadnetest.ariadne.vn
Accept-Encoding: gzip
<?xml version="1.0"?>
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://www.w3.org/2003/05/soap-encoding" xmlns:v="http://www.w3.org/2003/05/soap-envelope">
<v:Header/>
<v:Body>
<GetExistedSignData xmlns="http://tempuri.org/">
<displayId>HWI_00:1E:8C:87:7F:8D</displayId>
</GetExistedSignData>
</v:Body>
</v:Envelope>
作为回报,我得到:
HTTP/1.0 500 Internal Server Error
Date: Tue, 13 Dec 2011 15:46:07 GMT
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Content-Length: 2114
Connection: close
错误描述中最有用的部分是:
Error Code 64: Host not available
Background: The connection to the Web server was lost.
我对WCF和.NET不太熟悉,所以我没有选择可能出错的地方。我没有开发我需要在Android中使用的WCF服务。
答案 0 :(得分:0)
我认为这一行是错误的:
androidHttpTransport.call(method_name, envelope);
第一个参数应为:NAMESPACE + METHOD_NAME
答案 1 :(得分:0)
如果您有选择,最好不要在Android上使用SOAP。 SOAP比REST更复杂,需要一个Android不可用的复杂框架,至少目前是这样。