2016-04-16 2 views
1

Je suis un étudiant de première année en développement android. Aujourd'hui, j'utilise KSOAP2 pour utiliser WCF que j'ai fini sur le serveur. Tout d'abord, j'essaie d'utiliser le WCF sous forme de fenêtres. Il fonctionne correctement et les données ont été téléchargées. Ensuite, j'utilise WCF avec KSOAP2. La chaîne ne peut pas envoyer correctement et l'erreur est: La méthode a lancé l'exception 'org.ksoap2.SoapFault'. La valeur de l'erreur est la suivante: a: InternalServiceFault La valeur ne peut pas être nulle. Nom du paramètre: sAndroid utilise WCF (webservice)

Je n'ai pas le paramètre 's' dans le programme serveur et le programme android. La vision de .NET est framework 4.0. Si j'utilise .NET framework 4.5, l'android peut l'utiliser avec KSOAP2. Cependant, je dois utiliser 4.0 Comment puis-je résoudre ce problème? À la vôtre.

Le code android est indiqué ci-dessous:

transferthread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while (true) 
       { 

         SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME); 
         int a = 1; 
         request.addProperty("userid",a); 
         request.addProperty("healthData",info); 
         SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10); 
         envelope.dotNet = true; 
         envelope.bodyOut = request; 
         envelope.setOutputSoapObject(request); 
         HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
         androidHttpTransport.debug = true; 
         try { 
          androidHttpTransport.call(SOAP_ACTION, envelope); 
          // final SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); 
          envelope.getResponse(); 
          Log.e("str",envelope.getResponse().toString()); 
          a=1; 
          //Log.e("aaa",envelope.getResponse().toString()); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } catch (XmlPullParserException e) { 
          e.printStackTrace(); 
         } 



        try { 
         Thread.sleep(5000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 


       } 

      } 
     }); 
     transferthread.start(); 

Je pense que le problème est de ksoap2.

Répondre

0

Ma réponse est une autre solution alternative pour votre question sur la façon de mettre en œuvre Android utiliser WCF. J'avais l'habitude de faire un essai sur KSOAP2. Pour une raison quelconque (j'ai oublié) j'abandonne l'utiliser.

C'est ce que je fais pour faire la même chose.

Vous pouvez installer Wizdler (extension Chrome) pour générer votre enveloppe. et copiez la pâte dans le code de l'enveloppe.

Appelez getYourData dans votre tâche asynchrone.

public ArrayList<YourData> getYourData(String username, String password) { 
ArrayList<YourData> resultList; 
String resultData; 
try { 
    //Put your envelope here. 
    final String envelope = "<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + 
      " <Body>\n" + 
      "  <Something xmlns=\"http://www.example.com/RemoteServices/url/\">\n" + 
      "   <!-- Optional -->\n" + 
      "   <request>\n" + 
      "    <Authentication xmlns=\"http://schemas.datacontract.org/RemoteServicesv2.Core\">\n" + 
      "     <Password>" + 
      password + 
      "</Password>\n" + 
      "     <Username>" + 
      username + 
      "</Username>\n" 
      "  </Something>\n" + 
      " </Body>\n" + 
      "</Envelope>"; 

    resultData = CallWebService(URL, "http://www.example.com/webserviceURL", envelope); 
    Log.e("resultData for Something", ""+resultData); 
    resultList = parseFunction(resultData); 
} catch (Exception e) { 
    resultList = null; 
} 
return resultList; 

}

// How to send SOAP envelope to web service 
private String CallWebService(String url, 
           String soapAction, 
           String envelope) { 
    final DefaultHttpClient httpClient = new DefaultHttpClient(); 
    // request parameters 

    HttpParams params = httpClient.getParams(); 
    HttpConnectionParams.setConnectionTimeout(params, 20000); 
    HttpConnectionParams.setSoTimeout(params, 25000); 
    // set parameter 
    HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), true); 

    // POST the envelope 
    HttpPost httppost = new HttpPost(url); 
    // add headers 
    httppost.setHeader("soapaction", soapAction); 
    httppost.setHeader("Content-Type", "text/xml; charset=utf-8"); 

    String responseString = ""; 
    try { 

     // the entity holds the request 
     HttpEntity entity = new StringEntity(envelope); 
     httppost.setEntity(entity); 

     // Response handler 

     ResponseHandler<String> rh = new ResponseHandler<String>() { 
      // invoked when client receives response 

      public String handleResponse(HttpResponse response) 
        throws ClientProtocolException, IOException { 

       // get response entity 
       HttpEntity entity = response.getEntity(); 


       // read the response as byte array 
       StringBuffer out = new StringBuffer(); 
       byte[] b = EntityUtils.toByteArray(entity); 

       // write the response byte array to a string buffer 
       out.append(new String(b, 0, b.length)); 

       return out.toString(); 
      } 
     }; 

     responseString = httpClient.execute(httppost, rh); 


    } catch (Exception e) { 
     Log.v("exception", e.toString()); 
    } 

    String xml = responseString.toString(); 
    // close the connection 
    System.out.println("xml file ------" + xml); 
    httpClient.getConnectionManager().shutdown(); 
    return responseString; 
}