1

ksoap2を使用してAndroid経由で単純な.NET Webサービス(HelloWorld)を呼び出そうとしています(別のWebサービスですでに試して成功しました)。しかし、これには認証が必要なので、認証用のヘッダーを追加する方法を検索しましたが、それでもテキストビューに結果が返されません。

SoapObject Request = new SoapObject(NAMESPACE,METHOD_NAME);  
List<HeaderProperty> headers = new ArrayList<HeaderProperty>();
headers.add(new HeaderProperty("Authorization", "Basic"+Base64.encode("Username:Password".getBytes())));


        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet=true;
        envelope.setOutputSoapObject(Request);

        HttpTransportSE aht = new HttpTransportSE(URL);


        try{
            aht.call(SOAP_ACTION,envelope,headers);
            SoapPrimitive resultString = (SoapPrimitive)envelope.getResponse();

            tv.setText("yo :" + resultString);

        }
    catch(Exception e){
        e.printStackTrace();
    }

ログにもエラーがあります:

エラー: スレッドの接続に失敗しましたが、それが原因ではないと思います

HelloWorld メソッドの wsdl は次のとおりです。

>     <wsdl:types>
>     <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
>     <s:element name="HelloWorld">
>     <s:complexType/>
>     </s:element>
>     <s:element name="HelloWorldResponse">
>     <s:complexType>
>     <s:sequence>
>     <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string"/>
>     </s:sequence>
>     </s:complexType>
>     </s:element>

私の問題。この種の問題に遭遇した人はいますか、それとも私のコードはどこかで間違っていますか?

4

2 に答える 2

0

.これは、.net Web サービスにアクセスする方法です。私の場合、username と password の 2 つのパラメーターを送信しています。ここで、サービスはデータベースに従って文字列を返します。パラメーターを渡さない場合は、言及したパラメーターを削除して、これだけを追加してください。

PropertyInfo pi = new PropertyInfo();
    pi.setType(String.class);
    request.addProperty(pi);

そうしないと

 public String Call(String username, String password) {
    SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
            OPERATION_NAME);

    PropertyInfo pi = new PropertyInfo();
    pi.setName("username");
    pi.setValue(username);
    pi.setType(String.class);
    request.addProperty(pi);

    pi = new PropertyInfo();
    pi.setName("password");
    pi.setValue(password);
    pi.setType(String.class);
    request.addProperty(pi);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);

    envelope.dotNet = true;

    envelope.setOutputSoapObject(request);

    HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
    Object response = null;

    try {

        httpTransport.call(SOAP_ACTION, envelope);
        response = envelope.getResponse();
    }

    catch (Exception exception) {
        response = exception.toString();
    }

    return response.toString();
}
于 2013-02-18T11:45:10.097 に答える
0

これを試して:

 SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                        SoapEnvelope.VER11);    
request.addProperty("requst_name",request_value);//if you have any request add here..                   
 envelope.setOutputSoapObject(request);
 envelope.implicitTypes = true;
 envelope1.dotNet = true;
 int Timeout = 60000;
 HttpTransportSE androidHttpTransport = new HttpTransportSE(URL, Timeout);
 androidHttpTransport.debug = true;
                try {

                    androidHttpTransport.call(SOAP_ACTION, envelope);
                    Object response = envelope.getResponse();
                    String res=response.toString();
                    }

                    }catch (XmlPullParserException e) {

                        e.printStackTrace();
                    } catch (SocketTimeoutException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
于 2013-02-18T11:31:34.723 に答える