【问题标题】:SOAP call from Android with KSoap2 to .net WebServer从带有 KSoap2 的 Android 到 .net WebServer 的 SOAP 调用
【发布时间】:2026-01-17 15:35:02
【问题描述】:

大家好。

我正在尝试对本地运行的 .net WebServer 进行 SOAP 调用,但我认为我遗漏了一些东西。 Android代码对我来说似乎很好。也许 SOAP 请求是错误的......

这是网络服务器为我尝试调用的方法提供的:

POST /WebAvanza/WebAvanzaInterface.asmx HTTP/1.1
Host: localhost
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <InitTransazione xmlns="http://tempuri.org/">
      <ip>string</ip>
      <codice>string</codice>
    </InitTransazione>
  </soap12:Body>
</soap12:Envelope>

这是我到目前为止写的:

private String InitTransaction(String command){
        String NAMESPACE = "http://tempuri.org/";
        String METHOD_NAME = "InitTransazione";
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        request.addProperty("ip", ipAddress);
        request.addProperty("codice", command);

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

        HttpTransportSE httpTransport = new HttpTransportSE(URL);
        httpTransport.debug = true;

        String SOAP_ACTION = NAMESPACE + METHOD_NAME;

        Object result = null;
        try {
            httpTransport.call(SOAP_ACTION, envelope);
            result = envelope.getResponse();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return String.valueOf(result);
    }

URL是http://192.168.168.24/WebAvanza/WebAvanzaInterface.asmx,地址是指服务器运行所在的机器。

我只在执行httpTransport.call后得到一个异常。

这是 StackTrace(如果有人需要的话)

W/System.err: android.os.NetworkOnMainThreadException
W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1528)
W/System.err:     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:389)
W/System.err:     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
W/System.err:     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
W/System.err:     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
W/System.err:     at java.net.Socket.connect(Socket.java:621)
W/System.err:     at com.android.okhttp.internal.Platform.connectSocket(Platform.java:145)
W/System.err:     at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:141)
W/System.err:     at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:112)
W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:184)
W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:258)
W/System.err:     at org.ksoap2.transport.ServiceConnectionSE.openOutputStream(ServiceConnectionSE.java:130)
W/System.err:     at org.ksoap2.transport.HttpTransportSE.sendData(HttpTransportSE.java:295)
W/System.err:     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:184)
W/System.err:     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
W/System.err:     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
W/System.err:     at com.infovision.elcam_02.Operations$override.InitTransaction(Operations.java:64)
W/System.err:     at com.infovision.elcam_02.Operations$override.InitOperation(Operations.java:40)
W/System.err:     at com.infovision.elcam_02.Operations$override.access$dispatch(Unknown Source:49)
W/System.err:     at com.infovision.elcam_02.Operations.InitOperation(Unknown Source:15)

【问题讨论】:

  • 您是否在 Manifest 中检查过您是否拥有 Internet 权限?
  • 肯定的:&lt;uses-permission android:name="android.permission.INTERNET" /&gt;

标签: android soap ksoap2


【解决方案1】:

我发现问题出在服务器上并且代码很好...... 该死的,我花了将近 5 个小时在这后面.__.

【讨论】:

    【解决方案2】:

    检查您的代码我认为主要问题是因为您没有在异步线程中执行 Okhttpclient。

    我认为如果你使用 Okhttpclient 的 enqueue 方法运行代码应该可以解决问题。

    client.newCall(request).enqueue(new Callback() {
          @Override public void onFailure(Call call, IOException e) {
            //Exception here
            }
    
          @Override public void onResponse(Call call, Response response) throws IOException {
            try (ResponseBody responseBody = response.body()) {
               /*
               * Handle your response here :
               * Do whatever you want if the response.isSuccesful or not
               */ 
            }
        });
    

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答。我想 client 应该声明类似 OkHttpClient client = new OkHttpClient(); 的东西。如果是,它告诉我我不能在Ok HttpClient 中使用SoapObject