【发布时间】:2015-05-12 06:16:42
【问题描述】:
在 Android 中尝试使用 ksoap2 调用 svc web 服务(托管在 IIS 服务器中)时出现“InternalServiceFault”异常。
异常发生:
W/System.err:SoapFault - 故障代码:'a:InternalServiceFault' faultstring: 'OperationFormatter 遇到无效的消息正文。 预计会找到名称为“GetUnits”的节点类型“Element”和 命名空间'http://tempuri.org/'。找到具有名称的节点类型“元素” 'GetUnits' 和命名空间 'http://tempuri.org/IRestaurant/'' faultactor:'null' 详细信息:org.kxml2.kdom.Node@40c821a8 05-11 22:26:30.068 913-921/com.org.ansal.placemaorder W/System.err: at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:137)
请求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:itemId>1</tem:itemId>
</soapenv:Body>
</soapenv:Envelope>
调用代码:
new FetchData(LoginActivity.this).execute("http://tempuri.org/IRestaurant/","GetUnits","http://10.0.0.2/RestaurantServices/RegistrationServices.svc");
服务调用
@Override
protected String doInBackground(String... params) {
String result="";
String _NAMESPACE = params[0];
String _METHOD_NAME = params[1];
String URL = params[2];
String _SOAP_ACTION = _NAMESPACE + _METHOD_NAME;
SoapObject request = new SoapObject(_NAMESPACE, _METHOD_NAME);
request.addProperty("itemId",1);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.debug = true;
androidHttpTransport.setXmlVersionTag("<?xml version=\"1.0\" encoding= \"UTF-8\"?>");
androidHttpTransport.call(_SOAP_ACTION, envelope);
SoapObject resultsRequestSOAP = (SoapObject) envelope.getResponse();
result = resultsRequestSOAP.toString();
System.out.println("****** RESULT: " + resultsRequestSOAP.toString());
} catch (Exception e) {
System.out.println("******* THERE WAS AN ERROR ACCESSING THE WEB SERVICE");
e.printStackTrace();
}
return result;
}
【问题讨论】:
-
看起来你的smth不匹配。你的
_NAMESPACE等于什么? -
"tempuri.org/IRestaurant" 这是命名空间。我们将此作为第一个参数传递给服务调用函数。 new FetchData(LoginActivity.this).execute("tempuri.org/IRestaurant/","GetUnits","http:/…);
-
改成
tempuri.org试试看,有什么变化吗? -
是的,我将命名空间更改为“tempuri.org”并解决了“InternalServiceFault”异常。然后我得到了套接字超时异常,我通过在 HttpTransportSE 中给出超时间隔来解决它 androidHttpTransport = new HttpTransportSE(URL,60000);
-
那是另一个
exception,我只回答了你的要求