Android с веб-сервисом WCF, использующим ksoap2 - ошибка SoapFault - код ошибки: 'a: InternalServiceFault'

Я сделал простой проект для вызова веб-службы wcf, используя ksoap2. Но когда он вызывает envelope.getResponse (); это дает ошибку, говоря

Ошибка: SoapFault - код ошибки: 'а: InternalServiceFault» faultstring: 'Серверу не удалось обработать запрос из-за внутренней ошибки. Для получения дополнительной информации об ошибке либо включите IncludeExceptionDetailInFaults (либо из ServiceBehaviorAttribute, либо из поведения конфигурации) на сервере, чтобы отправить информацию об исключении обратно клиенту, либо включите трассировку в соответствии с документацией Microsoft .NET Framework 3.0 SDK. и проверить журналы трассировки сервера. faultactor: 'ноль' деталь: ноль

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 = "" +" \n  0000 \n  TEST \n  112233 \n  LoginVal \n ";

            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");
         }       
    }
}

Здесь я хочу отправить запрос, как это

 

0000
HELLO
1234
0

Мой ответный XML должен быть

 

1234

 Rajesh Rajaram18 окт. 2012 г., 07:08
@TobiasMoeThorstensen Привет, я разместил свой исходный код здесь
 Tobias Moe Thorstensen17 окт. 2012 г., 11:33
Можно ли увидеть исходный код? И файл wsdl от веб-службы, это может помочь нам.

Ответы на вопрос(3)

10.0.2.2, иначе он не будет работать !! приватная финальная строка SOAP_URL = "http://10.0.2.2:15398/Service1.svc ";

Решение Вопроса

быть 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;
}

Надеюсь, мой код поможет вам :). Работает на все 100%

 Vice Is Nice24 июл. 2013 г., 17:09
Просто интересно, каково значение VALIDATION_URI в приведенном выше коде? Это'не включается в качестве одной из строковых констант в верхней части файла.
 kinghomer24 июл. 2013 г., 17:55
Просто другая часть URL, где httpTrasport пытается подключиться. Подробно есть/WebServices/validateuser.svc», но в целом это путь SVC. URI + VRIIDATION URI = "www.yoursite.com/WebServices/validateuser.svc», Я должен был разделить это, потому что SVC не всегда локализован в одном и том же месте

FaultContract, Если из службы выдается исключение, сообщение об ошибке никогда не достигнет клиентской стороны. Так вот гдеFaultContract например. Скажем, например, что вызов службы вызовет исключение для службы. Как клиент должен знать о перехваченной ошибке?

Вот пример того, как вы могли бы реализовать:FaulContract

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

Метод в вашем "сервис-класс» долженimplement этот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;     
   }
}
</myfaultexception>

Теперь на стороне клиента вы можете поймать исключение. Для дальнейшего чтения я рекомендую вам прочитать:

Обработка исключений в WCF с использованием Fault Contract

Я надеюсь, что это укажет вам правильное направление.

Ваш ответ на вопрос