Соединение с WCF с KSOAP2 - позиция XmlPullParserException END_DOCUMENT
Я разработал 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 ответа
Задача решена. Если вы используете сервер разработки 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";
Если ваш веб-сервис возвращает сложный объект (возможно, строку), попробуйте это:
SoapObject response = (SoapObject)envelope.getResponse();
String string = response.toString();
вместо этого:
Object result = (Object)envelope.getResponse();