2016-03-14 3 views
0

Отказ от ответственности: Я ЕСМЬ новичок в программировании на Android :( Я видел аналогичный вопрос, размещенный здесь, но решение не сработало для меня. Я пытаюсь удовлетворить все критерии для правильно размещенного вопроса, поэтому, пожалуйста, несите меня. Я написал клиент C# для проверки моей службы wcf (SimpleHTTPTransport), и он отлично работает через Wi-Fi со второго компьютера, поэтому я знаю, что проблем с брандмауэром нет. http://10.0.0.134:4444/DietService.svc?msdl БЕСПЕРЕБОЙНАЯ ПОМОЩЬ. Служба настроена для анонимного пользователя, поэтому нет необходимой информации для входа. Я проверил все возможные ссылки, которые я мог найти здесь и в других местах в Интернете в течение 2 дней без какой-либо помощи. Я использую ksoap2 2.5. 2 и не могу заставить ничего работать. Я даже пытался настроить задачу Async. Я скопировал якобы «рабочий» код и до сих пор не могу получить никакой связи с службой wcf. его точка зрения, я полностью в тупике. Вот мой трассировки стека, код и переменные в момент передачи:ksoap2 ver. 2.5.2 HttpTransportSE возвращает null, независимо от того, что я пытаюсь

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 = {[email protected]} 
params = {Void[0]@4412} 
request = {[email protected]} "GetFoodName{id=7; }" 
name = {[email protected]} "GetFoodName" 
namespace = {[email protected]} "http://tempuri.org/" 
properties = {[email protected]} size = 1 
attributes = {[email protected]} size = 0 
shadow$_klass_ = {[email protected]} "class org.ksoap2.serialization.SoapObject" 
shadow$_monitor_ = -1920603187 
envelope = {[email protected]} 
addAdornments = true 
classToQName = {[email protected]} size = 5 
dotNet = true 
idMap = {[email protected]} size = 0 
implicitTypes = false 
multiRef = null 
properties = {[email protected]} size = 0 
qNameToClass = {[email protected]} size = 5 
bodyIn = null 
bodyOut = {[email protected]} "GetFoodName{id=7; }" 
    name = {[email protected]} "GetFoodName" 
    namespace = {[email protected]} "http://tempuri.org/" 
    properties = {[email protected]} size = 1 
    attributes = {[email protected]} size = 0 
    shadow$_klass_ = {[email protected]} "class org.ksoap2.serialization.SoapObject" 
    shadow$_monitor_ = -1920603187 
enc = {[email protected]} "http://schemas.xmlsoap.org/soap/encoding/" 
    count = 41 
    hashCode = -891961955 
    shadow$_klass_ = {[email protected]} "class java.lang.String" 
    shadow$_monitor_ = -1900538580 
encodingStyle = null 
env = {[email protected]} "http://schemas.xmlsoap.org/soap/envelope/" 
    count = 41 
    hashCode = -1487983936 
    shadow$_klass_ = {[email protected]} "class java.lang.String" 
    shadow$_monitor_ = -2032362507 
headerIn = null 
headerOut = null 
version = 110 
xsd = {[email protected]} "http://www.w3.org/2001/XMLSchema" 
xsi = {[email protected]} "http://www.w3.org/2001/XMLSchema-instance" 
shadow$_klass_ = {[email protected]} "class org.ksoap2.serialization.SoapSerializationEnvelope" 
shadow$_monitor_ = -1922298750 
myHttpTransport = {[email protected]} 
connection = null 
debug = true 
requestDump = null 
responseDump = null 
timeout = 60000 
url = {[email protected]} "http://10.0.0.134:4444/DietService.svc" 
    count = 38 
    hashCode = -193616475 
    shadow$_klass_ = {[email protected]} "class java.lang.String" 
    accessFlags = 8912913 
    classLoader = null 
    classSize = 666 
    clinitThreadId = 967 
    componentType = null 
    dexCache = {[email protected]} 
    dexCacheStrings = {String[41837]@4509} 
    dexClassDefIndex = 1399 
    dexTypeIndex = 1366 
    directMethods = 1877705544 
    iFields = 1875422136 
    ifTable = {Object[6]@4510} 
    name = {[email protected]} "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 = {[email protected]} "class java.lang.Object" 
    verifyErrorClass = null 
    virtualMethods = 1877707104 
    vtable = null 
    shadow$_klass_ = {[email protected]} "class java.lang.Class" 
    shadow$_monitor_ = 1263145082 
    shadow$_monitor_ = -1984993388 
xmlVersionTag = {[email protected]} "" 
    count = 0 
    hashCode = 0 
    shadow$_klass_ = {[email protected]} "class java.lang.String" 
    shadow$_monitor_ = -2067490254 
shadow$_klass_ = {[email protected]} "class org.ksoap2.transport.HttpTransportSE" 
shadow$_monitor_ = -2124603501 
myHttpTransport.debug = true 

ответ

0

Какой опыт обучения! В поисках большего количества ответов я обнаружил, что появилась новая библиотека ksoap2 (2.6.0), поэтому я решил обновиться с 2.5.2. Когда я это сделал, я заметил, что я использую зависимости 2.5.2 WITHOUT. После обновления моя трассировка стека была намного более подробной и указала на ошибку разрешений. Быстрый поиск по «сетке» меня проверял на

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

DUH! Я забыл добавить его в свой файл AndroidManifest.xml. Бинго! Соединение установлено. Теперь все, с чем мне пришлось столкнуться, было несоответствие контракта. Это требует добавления IDietService в пути SOAP_ACTION:

изменена:

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

к:

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

Используя версию С-зависимости библиотеки ksoap2 был ключ к решению. Я не знаю, помогло ли обновление версии. Я признаю, что меня смутило, когда мой блок catch обнаружил нуль для e.getMessage() при использовании ksoap2 2.5.2, но я предположил, что (да, я знаю), что это было так, как было. Итог -

ПРОВЕРЬТЕ СВОИ ПОДРОБНОСТИ!

Смежные вопросы