Соединение с WCF с KSOAP2 - позиция XmlPullParserException END_DOCUMENT - PullRequest
0 голосов
/ 12 декабря 2011

Я разработал WCF-сервис .NET4 и пытаюсь подключиться к нему из Android (1.6). Но когда я пытаюсь подключиться, все, что я получаю, это "org.xmlpull v1 xmlpullparserexception непредвиденный тип (позиция: END_DOCUMENT null @ 1: 0 в java.io.InputStreamReader@4396aa90)" ошибка .. Я уже проверил METHOD_NAME, NameSpace, URL , Soap_Action и выглядят хорошо для меня. Также я попытался с System.setProperty ("http.keepAlive", "false") и изменив SoapEnvelope.VER с 10 на 12, но все еще ничего .. Любые предложения?
Мой код:

package web.service;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.ksoap2.*;
import org.ksoap2.serialization.*;
import org.ksoap2.transport.*;
import org.w3c.dom.Text;

 public class WebServiceConnActivity extends Activity {

private static final String NAMESPACE = "http://tempuri.org/" ;
private static final String URL = "http://10.0.2.2:51599/Service.svc";
//private static final String URL = "http://10.0.2.2:51599/MyWCFApp/Service.svc";
private static final String Add_SOAP_ACTION = "http://tempuri.org/IService/HelloWorld";
private static final String METHOD_NAME1 = "HelloWorld";



public TextView tView;
public Button btn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    tView = (TextView)findViewById(R.id.tView);
    btn = (Button)findViewById(R.id.btn);

    btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            GetAdd();
        }
    });

}


public void GetAdd() 
{

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);

    //request.addProperty("value1", "2");
    //request.addProperty("value2", "3");

    SoapSerializationEnvelope envelope =
    new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    System.setProperty("http.keepAlive", "false");
    try
    {
        androidHttpTransport.call(Add_SOAP_ACTION, envelope);
        //java.lang.String receivedInt = (String)envelope.getResponse();
        Object result = (Object)envelope.getResponse();

        tView.setText(result.toString());

    }
    catch(Exception e)
    {
        tView.setText(e.toString());
    }

}  
}

Я потратил немного больше времени на эту проблему, и вот что мне приходит в голову: Проблема, вероятно, в URL - я разработал WS .NET3.5, и все работает отлично, и единственное отличие заключается в URL:

private static final String URL = "http://10.0.2.2:50915/aspWebService/Service.asmx";

Но я понятия не имею, где я мог ошибиться в URL WCF. Я взял URL из WDSL, и я просто изменил «localhost» на «10.0.2.2», адрес http://10.0.2.2:51599/Service.svc виден из браузера эмуляторов. Вот часть моего WDSL-файла с URL (я полагаю):

<wsdl:service name="Service">
<wsdl:port name="WSHttpBinding_IService" binding="tns:WSHttpBinding_IService">
<soap12:address location="http://localhost:51599/Service.svc"/>
<wsa10:EndpointReference>
<wsa10:Address>http://localhost:51599/Service.svc</wsa10:Address>
<Identity>
<Dns>localhost</Dns>
</Identity>
</wsa10:EndpointReference>
</wsdl:port>
</wsdl:service>

Любые намеки?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

Проблема решена. Если вы используете сервер разработки Visual Studio для тестирования службы WCF, вам может потребоваться развернуть службу в IIS. Как это сделать вы найдете по адресу: http://msdn.microsoft.com/en-us/library/aa751792.aspx

Затем внесите изменения в NAMESPACE, URL

private static final String NAMESPACE = "http://tempuri.org/" ;
private static final String URL = "http://MyWCFApp/Service.svc";
0 голосов
/ 13 декабря 2011

Если ваш веб-сервис возвращает сложный объект (возможно, строку), попробуйте следующее:

 SoapObject response = (SoapObject)envelope.getResponse();
 String string = response.toString();

вместо этого:

 Object result = (Object)envelope.getResponse();
...