Android with WCF web service using ksoap2 - error SoapFault - faultcode: 'a:InternalServiceFault'

最后都变了- 提交于 2019-11-28 05:09:09

问题


I have done a simple project to call wcf web service using ksoap2. But when it calls envelope.getResponse(); it gives error saying

Error: SoapFault - faultcode: 'a:InternalServiceFault' faultstring: 'The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.' faultactor: 'null' detail: null

package testing.wcf;
import java.io.IOException;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

import android.os.Bundle;
import android.os.StrictMode;
import android.widget.TextView;
import android.annotation.SuppressLint;
import android.app.Activity;

public class MainActivity extends Activity 
{
    private static final String strNAMESPACE = "http://www.testing.co.in/TestingService/";
    private static final String strURL = "http://www.testing.co.in/TestingService/UserDetails.svc";
    private static final String strSOAP_ACTION = "http://testing.co.in/TestingService/UserDetails/LoginDetails";
    private static final String strMETHOD_NAME = "LoginDetails";
    TextView tv;
    StringBuilder sb;
    String strInputXML;

      @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.testing);
        sb = new StringBuilder();       
            Call();
        tv.setText(sb.toString());
        //setContentView(tv);

    }
    public void Call()
    {
         try 
         {
             SoapObject request = new SoapObject(strNAMESPACE, strMETHOD_NAME);

            String inputxml = "<?xml version="+"\""+"1.0"+"\""+" encoding="+"\""+"utf-8"+"\""+" ?>" +"<MOB> \n  <PIN>0000</PIN> \n  <LOGINID>TEST</LOGINID> \n  <PNUMBER>112233</pNUMBER> \n  <REQUESTID>LoginVal</REQUESTID> \n </MOB>";

            request.addAttribute("strInputXML", inputxml);
            request.addAttribute("strOutputXML","");

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

             HttpTransportSE androidHttpTransport = new HttpTransportSE(strURL);
             androidHttpTransport.call(strSOAP_ACTION, envelope);
             SoapPrimitive result = (SoapPrimitive)envelope.getResponse();

             String resultData = result.toString();
             sb.append(resultData + "\n");
         }
         catch(Exception e)
         {
             sb.append("Error:\n" + e.getMessage() + "\n");
         }       
    }
}

Here I want to send the request like this

<?xml version="1.0" encoding="utf-8" ?> 
<PhoneData>
<PINNO>0000</PINNO>
<LOGINID>HELLO</LOGINID>
<PASSWORD>1234</PASSWORD>
<REQID>0</REQID>
</PhoneData>

My respond XML should be

<?xml version="1.0" encoding="utf-8" ?> 
<PhoneData>
<OTA>1234</OTA>
</PhoneData>

回答1:


I post my working code for consuming a WCF (binding of WCF has to be basicHttpBinding!):

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

private static final String SOAP_ACTION_VALIDATION = "IValidateUser_wcf/ValidateUser";
private static final String VALIDATION_METHOD = "ValidateUser";

public boolean validateUser_WCF(String username, String password){

    SoapSerializationEnvelope envelope = null;
    SoapObject request = null;
    HttpTransportSE httpTransportSE = null;

    try {
        request = new SoapObject(NAMESPACE, VALIDATION_METHOD);
        request.addProperty("username", username);
        request.addProperty("password", password);

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

            //////////////////////////////                               
            // here you can add a HEADER element if you want
        Element[] header = new Element[1];  

        header[0] = new Element().createElement(NAMESPACE_INFOCAD, "a1");                
        header[0].addChild(Node.TEXT, "HeaderTextContent");

        envelope.headerOut = header;
            //////////////////////////////                               

        httpTransportSE = new HttpTransportSE(URL+VALIDATION_URI, 10*10000); // second parameter is timeout
        httpTransportSE.debug = true;
        httpTransportSE.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        httpTransportSE.call(NAMESPACE+SOAP_ACTION_VALIDATION, envelope);

            // if response is a simple text result, you can call SoapPrimitive, if not, you have to call SoapObject result and navigate in response's tree like an xml file
        SoapPrimitive result = (SoapPrimitive)envelope.getResponse();

        //To get the data.
        String textResult = result.toString();
        Log.i("textResult", textResult); 

                    return true;

    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }finally{
                 // here you can see in LOG what is request you send and what is response received
                Log.i(getClass().getSimpleName(),"requestDump : "+httpTransportSE.requestDump);
                Log.i(getClass().getSimpleName(),"responseDump : "+httpTransportSE.responseDump);
    }

    return false;
}

Hope my code can help you :). It works at 100%




回答2:


I think you should Look into something called FaultContract. If an exception is thrown from the service, the error message will never reach to the client side. So here is where the FaultContract comes in. Say for instance that a call to the service will cause an exception on the service, how should the client know the catched error?

Here is an example on how you could implement the FaulContract:

//An interface for your service
[ServiceContract()]
    public interface IMultiply
    {
        [OperationContract()]
        int Multiply(int number1, int number2);
    }

The method in your "service-class" should implement this interface

//Service implementation

public  class DoSomeMath: IMultiply
{
   public int Multiply(int number1, int number2)
   {
     try 
     {
        int k = number1 * number2;
     } 
     catch (Exception e)
     {
       MyFaultException theFault = new MyFaultException();
       theFault.Reason = "Some Error " + e.Message.ToString();
       throw new FaultException<MyFaultException>(theFault);
     }      
     return k;     
   }
}

On the Client side, you can now catch the exception. For further reading i recommend you to read:

Exception Handling in WCF using Fault Contract

I hope this will point you in the right direction.




回答3:


For android Emulator use this ip:10.0.2.2 otherwise it will not work!! private final String SOAP_URL="http://10.0.2.2:15398/Service1.svc";



来源:https://stackoverflow.com/questions/12928759/android-with-wcf-web-service-using-ksoap2-error-soapfault-faultcode-ainte

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!