3

MicrosoftAzureでASMXWebサービスをセットアップしていて、Androidアプリケーションを使用してWebサービスにデータを送信し、出力を受信しようとしています。この目的のために、私はKSOAPライブラリを使用しています。

Webサービスで、文字列がnullかどうかを確認しています。もしそうなら、私はエラーコード「2405」を返します

[WebMethod]
        public string LoginUser(string auth_token, string username)
        {
            // All these tests performed, so someone from outside of out application
            // scope does not attempt to abuse our webservice.
            #region Check for nulls
            if (string.IsNullOrEmpty(auth_token))
                return "2405";
            if (string.IsNullOrEmpty(username))
                return "2405";
            #endregion
        }

私のAndroidアプリケーションでは、データを送信していますが、Webサービスは2405エラーコードを返します。これは、データが送信されないことを意味します。

以下は私のAndroidコードです:

        SoapObject request = new SoapObject(NAMESPACE, method_name);

        PropertyInfo pi = new PropertyInfo();
        pi.setName("auth_token");
        pi.setValue("TestAuth");
        request.addProperty(pi);

        PropertyInfo pe = new PropertyInfo();
        pe.setName("username");
        pe.setValue("TestUser");
        request.addProperty(pe);

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

        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.call(SOAP_ACTION, envelope);

名前空間、メソッド名、URLなどを提供できて申し訳ありません。これは会社のポリシーに違反しているため、ご理解いただければ幸いです。:)

それでも、エラーをもう一度確認します。上記のAndroidコードを呼び出した後、Webサービスは2405を返します。これは、ASMXコードによると、2つの値のいずれかがnullの場合です。

更新: SOAPリクエスト(androidHttpTransport.debug = true)をデバッグし、requestDumpとresponseDumpに対して次の結果を取得しました。

ダンプをリクエスト

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns:d="http://www.w3.org/2001/XMLSchema" 
            xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" 
            xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
  <v:Header />
  <v:Body>
    <LoginUser xmlns="http://tempuri.org" id="o0" c:root="1">
      <auth_token i:type="d:string">TestAuth</auth_token>
      <username i:type="d:string">TestUser</username>
    </LoginUser>
  </v:Body>
</v:Envelope>

responseDump

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <LoginUserResponse xmlns="http://tempuri.org/">
      <LoginUserResult>2405</LoginUserResult>
    </LoginUserResponse>
  </soap:Body>

</soap:Envelope>

UPDATE2
これはサーバーが期待するものです。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <LoginUser xmlns="http://tempuri.org/">
      <auth_token />
      <username />
    </LoginUser>
  </soap:Body>
</soap:Envelope>

これは、Androidアプリケーションが送信しているものです:

<?xml version="1.0" encoding="utf-8"?>
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance"     xmlns:d="http://www.w3.org/2001/XMLSchema"  xmlns:c="http://schemas.xmlsoap.org/soap/encoding/"     xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
    <v:Body>
        <LoginUser xmlns="http://tempuri.org" id="o0" c:root="1">
            <auth_token i:type="d:string">TestAuth</auth_token>
            <username i:type="d:string">TestUser</username>
        </LoginUser>
    </v:Body>
</v:Envelope>

これに加えて、Androidコードに次の行を追加しました。

androidHttpTransport.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");

助けてください!

どうもありがとう!

4

3 に答える 3

2

エラーをクリアすることができました...問題は、名前空間URIの後にバックスラッシュがないことでした...私がしなかった理由は、バックスラッシュで「シーケンスに要素が含まれていません」というエラーが発生したためです。 ..しかし、現在、さまざまなエラーが発生しています...ヘルプが必要な場合は、StackOverFlowに投稿します...寛大なヘルプに感謝します:)

明確にするために、サーバーがパラメーターを受け取るためには、名前空間の最後にバックスラッシュが必要です。

于 2012-01-16T16:32:53.500 に答える
0

こんにちは
問題を解決する方法は2つあります。1つはPropertyInfoを使用する方法、もう1つは私の方法です。パラメータをリクエストに直接追加する方法です。

最初の方法:

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

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

2番目の方法:

    SoapObject request = new SoapObject(NAMESPACE, method_name);
    request.addProperty("auth_token","TestAuth");
    request.addProperty("username","TestUser");

このコードを試してみてください。

于 2012-01-12T08:24:37.703 に答える
0

名前空間では、このように大文字のHでhttpを書くのに役立ちます

namespace="http://tempuri.org/"の代わりに; この名前空間を試してください="Http://tempuri.org";

少なくとも私の場合は役に立ちました。体がお役に立てば幸いです!

ガブリエル

于 2012-12-01T04:25:00.740 に答える