KSoap2 SoapObject Object Reference nie jest ustawiony na instancję

Myślę, że jest to prosty problem, że inni mogą dostarczyć brakujący link do. mamPrzepływ pracy Usługa wcf, z którą moi klienci .NET mogą się prawidłowo komunikować. Włączyłem śledzenie pod aplikacją i mogę obserwować prawidłowe wykonywanie połączeń serwisowych, więc czuję się komfortowo, że usługa nie stanowi problemu. Moje połączenia z Androidem nigdy nie trafiają w pierwszy punkt śledzenia.

W Androidzie przy użyciu ksoap2 (2.6.5), gdy wywołam tę linię, otrzymuję błąd nie określający odwołania do obiektu:

SoapObject response = (SoapObject)envelope.getResponse();

Dla mnie wydaje się to proste, koperta musi być zerowa, a kiedy próbujemy uzyskać dostęp do exec getResponse, mamy błąd, a mimo to w debuggerze pokazuje on go jako poprawny obiekt. Co więcej, nie mogę znaleźć dokumentacji do wyjaśnienia, a każdy samouczek, który widziałem, ma taki sposób ...?

Jedną rzeczą, która jest inna, jest to, że w .NET stworzyłbym obiekt przekazujący obiekt, pozwalając .NET na serializację dla mnie. Tutaj dodaję kilka parametrów i wszystkie są łańcuchami, ale enum, które pokażę, jest możliwym sprawcą. Oto moja pełna implementacja Java:

String NAMESPACE = "http://tempuri.org/";
String METHOD_NAME = "LiftDataExchange";
String SOAP_ACTION = "http://tempuri.org/ILiftDataExchange/ProcessDataRequest";
String URL = "http://www.icyarmtesting.com/LiftDataExchange.xamlx";
String SOAP_REMOTE_NAMESPACE = "http://schemas.datacontract.org/2004/07/IronMikeDataExchangeWorkflowService.Enum";

String X = "";
ExchangeEnumerations ExrcsEnum = ExchangeEnumerations.GetNextWorkout;

//Initialize soap request
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

//add parameters
PropertyInfo piAct = new PropertyInfo();
piAct.setName("Action");
piAct.setValue(ExrcsEnum);
piAct.setType(ExchangeEnumerations.class);
request.addProperty(piAct);

//Declare the version of the SOAP request
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.addMapping(SOAP_REMOTE_NAMESPACE, "ExchangeEnumerations", ExchangeEnumerations.class, ExchangeEnumerationsEnumClass.getInstance());
envelope.dotNet = true;
envelope.setOutputSoapObject(request);

//Needed to make the internet call
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug = true;
try 
    {          
  //this is the actual part that will call the webservice
  androidHttpTransport.call(SOAP_ACTION, envelope); 
  SoapObject response = (SoapObject)envelope.getResponse();
  X = response.getProperty(0).toString();
}
catch (Exception e)...... 

Oto mój zrzut z prośby:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
    <v:Header />
    <v:Body>
        <LiftDataExchange xmlns="http://tempuri.org/" id="o0" c:root="1">
            <UserName i:type="d:string">STERILIZED_OUT</UserName>
            <Password i:type="d:string">STERILIZED_OUT</Password>
            <ExerciseProgramID i:type="d:string">STERILIZED_OUT</ExerciseProgramID>
            <IncomingWorkoutData i:type="d:string">STERILIZED_OUT</IncomingWorkoutData>
            <Action i:type="n0:ExchangeEnumerations" xmlns:n0="http://schemas.datacontract.org/2004/07/IronMikeDataExchangeWorkflowService.Enum">GetNextWorkout</Action>
        </LiftDataExchange>
    </v:Body>
</v:Envelope>

Oto mój zrzut odpowiedzi:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <s:Fault>
            <faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode>
            <faultstring xml:lang="en-US">Object reference not set to an instance of an object.</faultstring>
            <detail>
                <ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <HelpLink i:nil="true"/>
                <InnerException i:nil="true"/>
                <Message>Object reference not set to an instance of an object.</Message>                
                <StackTrace>   at System.ServiceModel.Activities.WorkflowOperationContext.HandleEndResumeBookmark(IAsyncResult result)&#xD; at System.ServiceModel.Activities.WorkflowOperationContext.OnResumeBookmark()&#xD; at System.ServiceModel.Activities.WorkflowOperationContext..ctor(Object[] inputs, OperationContext operationContext, String operationName, Boolean performanceCountersEnabled, Boolean propagateActivity, Transaction currentTransaction, WorkflowServiceInstance workflowInstance, IInvokeReceivedNotification notification, WorkflowOperationBehavior behavior, ServiceEndpoint endpoint, TimeSpan timeout, AsyncCallback callback, Object state)&#xD; at System.ServiceModel.Activities.Description.WorkflowOperationBehavior.WorkflowOperationInvoker.OnBeginServiceOperation(WorkflowServiceInstance workflowInstance, OperationContext operationContext, Object[] inputs, Transaction currentTransaction, IInvokeReceivedNotification notification, TimeSpan timeout, AsyncCallback callback, Object state)&#xD; at System.ServiceModel.Activities.Dispatcher.ControlOperationInvoker.ControlOperationAsyncResult.PerformOperation()&#xD; at System.ServiceModel.Activities.Dispatcher.ControlOperationInvoker.ControlOperationAsyncResult.HandleEndGetInstance(IAsyncResult result)&#xD; at System.ServiceModel.Activities.Dispatcher.ControlOperationInvoker.ControlOperationAsyncResult.Process()&#xD; at System.ServiceModel.Activities.Dispatcher.ControlOperationInvoker.ControlOperationAsyncResult..ctor(ControlOperationInvoker invoker, Object[] inputs, IInvokeReceivedNotification notification, TimeSpan timeout, AsyncCallback callback, Object state)&#xD; at System.ServiceModel.Activities.Dispatcher.ControlOperationInvoker.InvokeBegin(Object instance, Object[] inputs, IInvokeReceivedNotification notification, AsyncCallback callback, Object state)&#xD; at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)&#xD; at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)&#xD; at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&amp; rpc)&#xD; at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</StackTrace><Type>System.NullReferenceException</Type></ExceptionDetail></detail></s:Fault></s:Body></s:Envelope>

AKTUALIZACJA:

Przejście na wywołania metod Edwina miało taki sam rezultat. Więc zaktualizowałem z KSoap2 2.6.5 3.0.0-RC4 i teraz otrzymuję wyjątek NullRefException. W poprzedniej wersji trafiłem na usługę i wrzuciłem obiekt, nie ustawiłem błędu. W tej wersji nie trafiam w serwis i nie rzucam NullRef. Kod jest taki sam, jedyne, co się zmienia, to która wersja KSoap używam. Napisałem prostą usługę (pamiętaj, że są to usługi przepływu pracy), która pobiera łańcuch, zmienia go i wycofuje ciąg.

FWIW to mój kod do wykonania połączenia:

String SOAP_ACTION = "http://tempuri.org/";
    String OPERATION_NAME="ChangeName";
    final String WSDL_TARGET_NAMESPACE = SOAP_ACTION;
    final String SOAP_ADDRESS= "http://www.icyarmtesting.com/ServiceTest/Service1.xamlx";
    Exception exception;
    String ErrorMsg="";
    String TEST_URL="" ;

    SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, OPERATION_NAME);

    //PropertyInfo piName = new PropertyInfo();
    //piName.setName("UserName");
    //piName.setValue("ramjet");
    //piName.setType(String.class);
    //request.addProperty(piName);
    request.addProperty("UserName", "ramjet");

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

    HttpTransportSE httpTransport =null;
    if(!TEST_URL.equals(""))
        httpTransport = new HttpTransportSE(TEST_URL);
    else
        httpTransport = new HttpTransportSE(SOAP_ADDRESS);



    Object Response =null;
     try
     {
        httpTransport.call(SOAP_ACTION + "IService/" + OPERATION_NAME, envelope);
        Response = envelope.getResponse();
      }
     catch (SocketTimeoutException ex) 
     {
         ErrorMsg="Unable to connect";
          Response=null;
         exception=ex;
      }
      catch (IOException ie) 
      {
       ErrorMsg="Unable to connect";
      Response=null;
       exception=ie;
      }
       catch (Exception e) 
       {
        ErrorMsg="Unable to connect";
        Response=null;
        exception=e;
     }

questionAnswers(4)

yourAnswerToTheQuestion