使用kso​​ap2在Android上使用WCF服务 - 内部服务器错误

问题描述:

我正在为WCF服务开发Android客户端。有一个Windows应用程序,与服务一起工作,没有任何问题。但是,当我尝试使用Android上的服务时,使用kSoap2 - 我得到500内部服务器错误。显然,我做错了什么,但无法弄清楚什么。使用kso​​ap2在Android上使用WCF服务 - 内部服务器错误

这里是我的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服务。

如果你有选择,最好是在Android上不要使用肥皂。 SOAP比REST复杂得多,并且需要一个不适用于Android的复杂框架,至少现在是如此。

+0

其他选择是什么? – ozmank

我觉得这条线是错误的:

androidHttpTransport.call(method_name, envelope); 

第一个参数应该是:NAMESPACE + METHOD_NAME

+0

没有什么区别。根据kSoap2文档,第一个参数用于设置SOAP 1.2中未使用的“soapAction”标头字段。 – intellion