3

我正在尝试使用 .net Web 服务中的方法。

Web 服务背后的代码在命名空间的末尾有一个“/”

[WebService(Namespace = "http://www.mynamespace.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

这是.net方法调用

POST /TelematicsWebService/Service.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.mynamespace.com/GetDevicesByBranch"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetDevicesByBranch xmlns="http://www.mynamespace.com/">
      <branchNumber>int</branchNumber>
    </GetDevicesByBranch>
  </soap:Body>
</soap:Envelope>

现在调用该方法的代码如下所示

    @Override
    protected SoapObject doInBackground(Integer... branchNumber) {

        final String NAMESPACE = "http://www.mynamespace.com/";
        final String METHOD_NAME = "GetDevicesByBranch";
        final String SOAP_ACTION = NAMESPACE + METHOD_NAME;
        final String URL = "http://10.0.2.2/TelematicsWebService/Service.asmx";

        SoapObject response = null;

        try {
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

            PropertyInfo inputArgs = new PropertyInfo();
            inputArgs.setName("branchNumber");
            inputArgs.setValue(branchNumber);
            inputArgs.setType(Integer.class);
            request.addProperty(inputArgs);

            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                    SoapEnvelope.VER11);
            envelope.dotNet = true;
            envelope.setOutputSoapObject(request);

            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL,
                    25000);
            androidHttpTransport.call(SOAP_ACTION, envelope);
            response = (SoapObject) envelope.getResponse();
        } catch (Exception exception) {
            response = null;
        }

        return response;
    }

接近结尾的行,androidHttpTransport.call(SOAP_ACTION, envelope);,引发异常:java.lang.RuntimeException: Cannot serialize: [Ljava.lang.Integer;@412e0cf0

我找不到这个问题的解决方案,有什么建议吗?

4

3 回答 3

7

我想到了...

如果使用 Override doInBackground() 方法尚不明显,则它位于 AsyncTask<>() 内部。输入参数是一个Integer...类型。

protected SoapObject doInBackground(Integer... branchNumber)

我不知道省略号究竟做了什么,但我知道它使参数成为一个数组。

我将一个整数数组传递给请求对象,而不是一个特定的数组元素。

从改变

request.addProperty("branchNumber", branchNumber);

request.addProperty("branchNumber", branchNumber[0]);

解决了这个问题。

谢谢@Paul-Jan 和@beginner!我很感激你的回答!

于 2012-08-10T21:49:03.657 回答
0

代替

PropertyInfo inputArgs = new PropertyInfo();
inputArgs.setName("branchNumber");
inputArgs.setValue(branchNumber);
inputArgs.setType(Integer.class);
request.addProperty(inputArgs);

尝试这个:

request.addProperty("branchNumber", branchNumber);
于 2012-08-10T19:09:42.830 回答
0

对于那些想要添加对象列表作为 Web 服务参数的人:

List<Object> vect = new Vector<Object>();
vect.add("Element1");
vect.add("Element2");
vect.add("Element3");

PropertyInfo tabProp =new PropertyInfo();
tabProp.setName("LIST_PARAM");          
tabProp.setValue(vect);

request.addProperty(tabProp );

当然不需要注意 Async Task 必须实现方法:

protected String doInBackground(List<Object>... params){
....
....
} 
于 2013-02-15T16:47:13.503 回答