0

免责声明:我是 Android 编程的新手 :( 我在这里看到过类似的问题,但该解决方案对我不起作用。我正在努力满足正确发布问题的所有标准,所以请多多包涵。我写道一个 C# 客户端来测试我的 wcf 服务(SimpleHTTPTransport),它可以在第二台计算机上通过 WiFi 正常工作,所以我知道没有防火墙问题。我的 Android 浏览器可以访问 http://10.0.0.134:4444/DietService.svc?msdl没有问题。该服务是为匿名用户设置的,因此不需要登录信息。在没有帮助的情况下,我已经检查了我在这里和网络上其他地方可以找到的所有可能的参考资料 2 天。我正在使用 ksoap2 2.5.2 并且无法正常工作。我什至尝试过设置异步任务。我复制了所谓的“工作”代码,但仍然无法与 wcf 服务通信。在这一点上,我完全被难住了。这是我的堆栈跟踪、代码和传输时的变量:

Stack Trace:

 org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:130)
 diet.diet.MainActivity$AsyncCaller.doInBackground(MainActivity.java:113)
 diet.diet.MainActivity$AsyncCaller.doInBackground(MainActivity.java:83)
 android.os.AsyncTask$2.call(AsyncTask.java:295)
 java.util.concurrent.FutureTask.run(FutureTask.java:237)
 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
 java.lang.Thread.run(Thread.java:818)

CODE:

package diet.diet;

    import android.app.ProgressDialog;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Button;
    import android.widget.TextView;

    import org.ksoap2.*;
    import org.ksoap2.serialization.*;
    import org.ksoap2.transport.*;

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {

        private static final Integer TIMEOUT = 60000;
        private static final String METHOD_NAME = "GetFoodName";

        private static final String NAMESPACE = "http://tempuri.org/";

        private static final String URL = "http://10.0.0.134:4444/DietService.svc";

        final static String SOAP_ACTION = "http://tempuri.org/IDietService/GetFoodName";

        Button btn_Request;
        TextView tv_Reply;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            btn_Request = (Button) findViewById(R.id.btn_Request);
            btn_Request.setOnClickListener(this);
            tv_Reply = (TextView) findViewById(R.id.tv_Reply);

            setSupportActionBar(toolbar);

            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();
                }
            });
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();

            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }

            return super.onOptionsItemSelected(item);
        }

        @Override
        public void onClick(View v) {
            tv_Reply.setText("Got it");
            new AsyncCaller().execute();
        }
        private class AsyncCaller extends AsyncTask<Void, Void, Void>
        {
            private String resultData;

            ProgressDialog pdLoading = new ProgressDialog(MainActivity.this);
            @Override
            protected void onPreExecute() {
                super.onPreExecute();

                pdLoading.setMessage("Loading...");
                pdLoading.show();
            }
            @Override
            protected Void doInBackground(Void... params) {

                try {

                    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

                    request.addProperty("id", "7");

                    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                    envelope.dotNet = true;
                    Log.i("CYBERON", "Check 1");
                    envelope.setOutputSoapObject(request);
                    Log.i("CYBERON", "Check 2");

                    HttpTransportSE myHttpTransport = new HttpTransportSE(URL, TIMEOUT);
                    myHttpTransport.debug = true;
                    try {
                        myHttpTransport.call(SOAP_ACTION, envelope);
                    }
                    catch (Exception e)
                    {
                        StackTraceElement[] stack = e.getStackTrace();
                        String Trace = "";
                        for(StackTraceElement line : stack)
                        {
                            Trace += line.toString();
                            Trace += "\n";
                        }
    //                    Log.i("CYBERON", "Exception caught");
    //                    Log.i("CYBERON", "RESPONSE: " + myHttpTransport.responseDump);
                    }
                    Log.i("CYBERON", "Check 3");
                    SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
                    Log.i("CYBERON", "Check 4");

                    //to get the data
                    resultData = result.toString();
                    // 0 is the first object of data
                    Log.i("CYBERON", "Check 5");

                } catch (Exception e) {
                    Log.i("CYBERON", e.getMessage());
                }

                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);

                pdLoading.dismiss();
                tv_Reply.setText(resultData);
            }
        }
    }

这是我中断 myHttpTransport.call 时可以找到的内容:

this = {MainActivity$AsyncCaller@4404} 
params = {Void[0]@4412} 
request = {SoapObject@4413} "GetFoodName{id=7; }"
 name = {String@4439} "GetFoodName"
 namespace = {String@4440} "http://tempuri.org/"
 properties = {Vector@4441}  size = 1
 attributes = {Vector@4442}  size = 0
 shadow$_klass_ = {Class@4392} "class org.ksoap2.serialization.SoapObject"
 shadow$_monitor_ = -1920603187
envelope = {SoapSerializationEnvelope@4414} 
 addAdornments = true
 classToQName = {Hashtable@4429}  size = 5
 dotNet = true
 idMap = {Hashtable@4430}  size = 0
 implicitTypes = false
 multiRef = null
 properties = {Hashtable@4431}  size = 0
 qNameToClass = {Hashtable@4432}  size = 5
 bodyIn = null
 bodyOut = {SoapObject@4413} "GetFoodName{id=7; }"
  name = {String@4439} "GetFoodName"
  namespace = {String@4440} "http://tempuri.org/"
  properties = {Vector@4441}  size = 1
  attributes = {Vector@4442}  size = 0
  shadow$_klass_ = {Class@4392} "class org.ksoap2.serialization.SoapObject"
  shadow$_monitor_ = -1920603187
 enc = {String@4433} "http://schemas.xmlsoap.org/soap/encoding/"
  count = 41
  hashCode = -891961955
  shadow$_klass_ = {Class@3919} "class java.lang.String"
  shadow$_monitor_ = -1900538580
 encodingStyle = null
 env = {String@4434} "http://schemas.xmlsoap.org/soap/envelope/"
  count = 41
  hashCode = -1487983936
  shadow$_klass_ = {Class@3919} "class java.lang.String"
  shadow$_monitor_ = -2032362507
 headerIn = null
 headerOut = null
 version = 110
 xsd = {String@4435} "http://www.w3.org/2001/XMLSchema"
 xsi = {String@4436} "http://www.w3.org/2001/XMLSchema-instance"
 shadow$_klass_ = {Class@4395} "class org.ksoap2.serialization.SoapSerializationEnvelope"
 shadow$_monitor_ = -1922298750
myHttpTransport = {HttpTransportSE@4415} 
 connection = null
 debug = true
 requestDump = null
 responseDump = null
 timeout = 60000
 url = {String@4426} "http://10.0.0.134:4444/DietService.svc"
  count = 38
  hashCode = -193616475
  shadow$_klass_ = {Class@3919} "class java.lang.String"
   accessFlags = 8912913
   classLoader = null
   classSize = 666
   clinitThreadId = 967
   componentType = null
   dexCache = {DexCache@4508} 
   dexCacheStrings = {String[41837]@4509} 
   dexClassDefIndex = 1399
   dexTypeIndex = 1366
   directMethods = 1877705544
   iFields = 1875422136
   ifTable = {Object[6]@4510} 
   name = {String@4473} "java.lang.String"
   numDirectMethods = 39
   numInstanceFields = 2
   numReferenceInstanceFields = 0
   numReferenceStaticFields = 2
   numStaticFields = 4
   numVirtualMethods = 55
   objectSize = 0
   primitiveType = 131072
   referenceInstanceOffsets = 0
   sFields = 1875422072
   status = 10
   superClass = {Class@2987} "class java.lang.Object"
   verifyErrorClass = null
   virtualMethods = 1877707104
   vtable = null
   shadow$_klass_ = {Class@735} "class java.lang.Class"
   shadow$_monitor_ = 1263145082
  shadow$_monitor_ = -1984993388
 xmlVersionTag = {String@4427} ""
  count = 0
  hashCode = 0
  shadow$_klass_ = {Class@3919} "class java.lang.String"
  shadow$_monitor_ = -2067490254
 shadow$_klass_ = {Class@4403} "class org.ksoap2.transport.HttpTransportSE"
 shadow$_monitor_ = -2124603501
myHttpTransport.debug = true
4

1 回答 1

0

多么好的学习经历!在寻找更多答案时,我发现有一个更新的 ksoap2 库(2.6.0)所以我决定从 2.5.2 升级。当我这样做时,我注意到我使用的是没有依赖关系的 2.5.2。升级后,我的堆栈跟踪更加详细,并指示权限错误。在网上快速搜索让我检查了

 <uses-permission android:name="android.permission.INTERNET"/>

呃!我忘了将它添加到我的 AndroidManifest.xml 文件中。答对了!连接已建立。现在我必须处理的只是合同不匹配。这需要将 IDietService 添加到SOAP_ACTION路径:

改变:

final static String SOAP_ACTION = "http://tempuri.org/GetFoodName";

至:

final static String SOAP_ACTION = "http://tempuri.org/IDietService/GetFoodName";

使用 WITH-DEPENDENCIES 版本的 ksoap2 库是解决方案的关键。不知道版本升级有没有帮助。我承认,当我的 catch 块在使用 ksoap2 2.5.2 时发现 e.getMessage() 为 null 时,我感到很困惑,但我认为(是的,我知道)事实就是这样。底线——

检查您的详细信息!

于 2016-03-15T18:25:33.560 回答