Reputation: 3277
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>
Upvotes: 3
Views: 6379
Reputation: 38
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";
Upvotes: 0
Reputation: 3161
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%
Upvotes: 4
Reputation: 8981
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.
Upvotes: 1