5

Ksoap2を使用してAndroid4.03デバイスでdot.netベースのWebサービスに接続したい。

私の問題は、soapリクエストを呼び出すと、次の例外が発生することです。

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ファイルのヘッダーはおそらく私の名前空間がfalseです

    <?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

4 に答える 4

2

Fiddlerトラフィックを追跡するために使用します。おそらくサーバー/サービスが返されていますContent-Length: 0 これは何でもかまいません.私の場合Content-type、クライアントアプリから送信された不一致と、サーバー側で予期されたコンテンツタイプでした. 例外は、サービスからByteArrayInputStream長さ <= 0 のコンテンツを受信したことを明確に示しているためです。

これにより、さらに調査するようになることを願っています。

乾杯、

于 2012-11-21T00:47:22.487 に答える
1

この行の後のデバッグを確認しましたか?

SoapObject response = (SoapObject) Envelope.getResponse();

webservice? によってプロパティを返した場合。返されたデータがない可能性があります

使用する

int arraySize = response.getPropertyCount();

長さをチェックして、データを受信して​​いるかどうかを確認します

ここでチェックせずにプロパティにアクセスしようとしているため、argumentException が生成される可能性があると思います。

final String SessionID = response.getProperty("SessionID").toString();

propertyCount をテストして教えてください。

編集:

これをテストしてください:

SoapEnvelope を VER12 から VER11 に変更

 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);

webService URL を wdsl からこのタイプ (svc) に変更します。

 String URL = "http://host:8080/HelloWCF/Service1.svc";
于 2012-11-16T09:41:21.507 に答える
1

次のように使用します。

基本的なHttpバインディング:

                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 = new SoapSerializationEnvelope( SoapEnvelope.VER12);

着替える

SoapSerializationEnvelope エンベロープ = 新しい SoapSerializationEnvelope(SoapEnvelope.VER11);

2) コードからこの部分を削除しました。

ht.debug = true;

3)

SoapObject 応答 = (SoapObject) Envelope.getResponse();

着替える

SoapPrimitive レスポンス = (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);

参照

于 2013-08-02T06:26:32.740 に答える
-3

私の選択: 1.最新の 3.1.0 ksoap2 jar を使用: http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2 2. v12 を v11 に変更

于 2013-11-14T04:57:17.797 に答える