ksoap2: java.lang.IllegalArgumentException: размер <= 0 при создании http.call
Я хочу подключиться к основанному на dot.net веб-сервису с моим устройством Android 4.03, используя Ksoap2.
Моя проблема в том, что когда я вызываю запрос мыла, я получаю следующее исключение:
11-16 08:35:08.649: W/System.err(6392): java.lang.IllegalArgumentException: size <= 0
11-16 08:35:08.649: W/System.err(6392): at java.io.BufferedInputStream.<init>(BufferedInputStream.java:94)
11-16 08:35:08.649: W/System.err(6392): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:226)
11-16 08:35:08.649: W/System.err(6392): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:114)
11-16 08:35:08.649: W/System.err(6392): at at.jesenko.eDoc.MainActivity$1.run(MainActivity.java:48)
Код, который я использую
final String url = "http://server:9007/DWService?wsdl";
final String NAMESPACE = "http://tempuri.org/";
final String METHOD_NAME ="Login";
final String SOAP_ACTION="http://tempuri.org/Login";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Thread loginThread = new Thread(){
@Override
public void run() {
try {
SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
Request.addProperty("userName", "demo");
Request.addProperty("password", "demo1234");
Request.addProperty("organization", "Peters Engineering");
SoapSerializationEnvelope Envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER12);
Envelope.dotNet=true;
Envelope.setOutputSoapObject(Request);
HttpTransportSE ht = new HttpTransportSE(url);
ht.debug = true;
ht.call(SOAP_ACTION, Envelope);
SoapObject response = (SoapObject) Envelope.getResponse();
final String SessionID = response.getProperty("SessionID").toString();
runOnUiThread(new Runnable() {
public void run() {
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText(SessionID);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
};
loginThread.start();
}
Вот часть файла wsdl, которую я хочу вызвать:
<wsdl:definitions name="DWService" targetNamespace="http://tempuri.org/">
<wsdl:types>
<xsd:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
<xsd:element name="Login">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" name="userName" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="password" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="organization" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
У меня нет большого опыта работы с Ksoap и Web-сервисами, поэтому я надеюсь, что кто-нибудь может помочь мне решить эту проблему:)
Привет.
РЕДАКТИРОВАТЬ
я пробовал использовать вместо?svc -> те же ошибки:(
РЕДАКТИРОВАТЬ
Здесь заголовок файла WSDL, может быть, мое пространство имен ложно
<?xml version="1.0" encoding="UTF-8"?>
-<wsdl:definitions xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"
xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:tns="http://tempuri.org/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://tempuri.org/" name="DWService">
-<wsdl:types>-
<xsd:schema targetNamespace="http://tempuri.org/" elementFormDefault="qualified">-
<xsd:element name="Login">-
<xsd:complexType>-
<xsd:sequence>
<xsd:element name="userName" type="xsd:string" nillable="true" minOccurs="0"/>
<xsd:element name="password" type="xsd:string" nillable="true" minOccurs="0"/>
<xsd:element name="organization" type="xsd:string" nillable="true" minOccurs="0"/></xsd:sequence>
</xsd:complexType>
</xsd:element>
-<xsd:element name="LoginResponse">
-<xsd:complexType>-
<xsd:sequence>
<xsd:element name="LoginResult" type="q1:ClientServiceSession" nillable="true" minOccurs="0"
xmlns:q1="http://schemas.datacontract.org/2004/07/DocuWare.WebServices.GAPIFunctionality.DataContracts"/>
</xsd:sequence></xsd:complexType></xsd:element>
И часть мыла:
-<wsdl:binding name="BasicHttpBinding_IDWService" type="tns:IDWService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
-<wsdl:operation name="Login"><soap:operation style="document" soapAction="http://tempuri.org/IDWService/Login"/>
-<wsdl:input><soap:body use="literal"/></wsdl:input>
-<wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation>
-<wsdl:operation name="Logoff"><soap:operation style="document" soapAction="http://tempuri.org/IDWService/Logoff"/>
-<wsdl:input><soap:body use="literal"/></wsdl:input>
-<wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation>
-<wsdl:service name="DWService">
-<wsdl:port name="BasicHttpBinding_IDWService" binding="tns:BasicHttpBinding_IDWService"><soap:address location="http://localhost:9007/DWService"/></wsdl:port></wsdl:service>
Надеюсь, вы можете помочь мне;)
4 ответа
Использование Fiddler
отслеживать трафик. Вероятно, сервер / служба возвращается Content-Length: 0
Это может быть что угодно, в моем случае это было Content-type
несоответствие, отправленное клиентским приложением, и ожидаемый тип содержимого на стороне сервера. Поскольку исключение ясно указывает на то, что ByteArrayInputStream
получил контент длиной <= 0 от сервиса.
Я надеюсь, что это заставит вас расследовать больше.
Ура,
Вы проверили отладку после этой строки?
SoapObject response = (SoapObject) Envelope.getResponse();
Если вы вернули свойства через веб-сервис? Может быть, никаких данных не возвращается
использование
int arraySize = response.getPropertyCount();
И проверьте длину, чтобы узнать, если вы получаете данные
Я думаю, что argumentsException может быть получено, потому что вы пытаетесь получить доступ к свойству, не проверяя его здесь:
final String SessionID = response.getProperty("SessionID").toString();
Проверьте propertyCount и сообщите нам.
РЕДАКТИРОВАТЬ:
Проверьте это, пожалуйста:
Измените SoapEnvelope с VER12 на VER11
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
Измените URL-адрес webService с wdsl на этот тип (svc):
String URL = "http://host:8080/HelloWCF/Service1.svc";
Используйте как это:
BasicHttpBinding:
SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
Request.addProperty("userName", "demo");
Request.addProperty("password", "demo1234");
Request.addProperty("organization", "Peters Engineering");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(Request);
HttpTransportSE ht = new HttpTransportSE(URL);
try {
ht.call(SOAP_ACTION, envelope);
final SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
Я сделал некоторые изменения в вашем коде.
1)
SoapSerializationEnvelope Envelope = новый SoapSerializationEnvelope( SoapEnvelope.VER12);
изменить в
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope (SoapEnvelope.VER11);
2) Я удалил эту часть из вашего кода.
ht.debug = true;
3)
SoapObject response = (SoapObject) Envelope.getResponse ();
изменить в
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
убедитесь, что вы добавили интернет-разрешение в своем манифесте
<uses-permission android:name="android.permission.INTERNET"/>
если вы не получили вывод с помощью этого, проблема может быть ваш wsdl
Для получения дополнительной справки Надеюсь, это поможет вам.
PS.
WsHttpBinding:
Element e = new Element();
e.setName("To");
e.setNamespace("http://www.w3.org/2005/08/addressing");
e.addChild(Node.TEXT,
"your URL HERE");
Element e1 = new Element();
e1.setName("Action");
e1.setNamespace("http://www.w3.org/2005/08/addressing");
e1.addChild(Node.TEXT,
"http://tempuri.org/IService1/HelloTest");
request.addProperty("Celsius", "32");
// use VER12 instead of VER11
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
envelope.dotNet=true;
// add HederOut to envelope
envelope.headerOut = new Element[] { e, e1 };
envelope.setOutputSoapObject(request);
Мой выбор: 1.использовать новейшую версию 3.1.0 ksoap2 jar: http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2 2. поменял v12 на v11