6

どうやらこれはかなり頻繁に経験される問題です。問題がどこにあるのか、何を調整する必要があるのか​​完全にはわかりませんが、私の人生では、パラメーターを使用して.NETXMLWebサービスからSoapObjectまたはSoapPrimitiveにNULLの結果以外を取得することはできません。

私はネット上で見つけたすべてを試しました:

  • .setXmlVersionTagの追加=変更なし
  • SoapPrimitiveの代わりにSoapObjectを使用する=変更なし
  • SoapObjectの代わりにSoapPrimitiveを使用する=変更なし
  • AndroidHttppTransportの代わりにHttpTransportSEを使用する=変更なし
  • HttpTransportSEの代わりにAndroidHttpTransportを使用する=変更なし
  • .dotNet =true=変更なしの設定
  • .dotNet割り当て行の削除=変更なし
  • Webサービスからコロン(HTTP://プレフィックス全体)を削除する=変更なし
  • 直接割り当ての代わりにPropertyInfoクラスを使用する=変更なし
  • PropertyInfoクラスの代わりに直接割り当てを使用する=変更なし

私は完全に途方に暮れていて、それはかなりイライラしています。私はWebサービスを完全に制御しているので(私はそれを書きました)、小さな変更があれば、私は喜んで試みます。

現在、私のコードは次のとおりです。

public void GetResults()
{
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("lastName", "sm");
request.addProperty("middleName", "");
request.addProperty("firstName", "");
request.addProperty("pageSize", 25);
request.addProperty("pageNumber", 1);

SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);           
soapEnvelope.dotNet = true;
soapEnvelope.setOutputSoapObject(request);

//AndroidHttpTransport aht = new AndroidHttpTransport(URL);
HttpTransportSE aht = new HttpTransportSE(URL);

try
{
    aht.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    aht.call(SOAP_ACTION, soapEnvelope);           

    //SoapObject result = (SoapObject)soapEnvelope.bodyIn;
    SoapObject result = (SoapObject)soapEnvelope.getResponse();
    //SoapPrimitive result = (SoapPrimitive) soapEnvelope.getResponse();
    //Object result = soapEnvelope.getResponse();

    Log.d("WS", String.valueOf(result));          
}
catch(Exception e)
{
    e.printStackTrace();
}       
}

そして私のグローバルは次のようになります:

private static final String SOAP_ACTION = "http://yoda/SearchPerson";
private static final String METHOD_NAME = "SearchPerson";
private static final String NAMESPACE = "http://yoda/";
private static final String URL = "http://yoda/ws.asmx";

パラメータ化されていないWebサービスが血まみれのチャンピオンのように機能しているため、「yoda」が正しく翻訳されていることはわかっています。(明らかに(一部またはすべて)目前の問題である'request.addProperty'呼び出しを除いて、すべてが同一です。)

重要な場合は、KSoap2 2.5.2を使用して1.6ターゲットプラットフォームに対してこれを記述しており、すべての異なるAndroidエミュレーターで同じように動作します。

私はwiresharkでパケットをスニッフィングしましたが、エミュレーターは正しいものを送信しているように見えますが、受信する結果は常にNULLです。(これらの正確なパラメーターを、これらのWebサービスを使用するテストWebサイトに対して何度もテストしましたが、すべてが完全に機能しています。)

だから、誰かが私に骨をここに投げることができますか?

ありがとう、

マグア

2010.11.28を編集:

Wiresharkがパラメータを送信していると言っていても、Webサービスがパラメータを正しく受信していないように見えます。最初のパラメーターが何であれ、Webサービス自体からハードコードされた最後に「TEST」が付いた単純な文字列を返すことを想定したまったく新しいサービスを作成しました。

ええと、これを(Androidから)実行するたびに結果が得られ、それは常に「テスト」です。SoapEnvelopeをどのように定式化するか、またはパラメーターとして何を渡すかに関係なく、常に「TEST」を受け取ります。もちろん、サーバー上でWebサービスを呼び出すと、それはチャンピオンのように機能します(そして、私の結果は「これはテストです」です)。

私のWebサービスはIIS7を搭載したWindowsServer2008上にあります。アプリケーションプールは、「統合」マネージドパイプラインモードのフレームワークv2.0(v4.0ではない)に対して実行されています。

切断がどこにあるのかわかりません。KSoap2がパラメータを不適切に送信していませんか?IISが正しく構成されていませんか?完全に他に何か?

4

5 に答える 5

8

わお。これをあらゆる種類の奇妙なことや見落としにまでチョークしますが、私はそれを修正しました。

問題は、名前空間の最後に末尾の「/」がないことでした。Androidグローバル用に宣言された名前空間ではなく、service.asmx.csファイルの先頭近くのWebサービス自体で宣言された名前空間。(WebServiceBindingのすぐ上)。

最後に追加すると、すべてがチャンピオンのように機能していました。

奇妙なことに、これは明らかに、パラメーターを持たないメソッドが完全に機能していたため、パラメーターを受け取るメソッドにのみ影響します。そして、まったく同じサービスを使用する私のWebサイトとしてKSoap2を使用した場合にのみ、問題なく機能していました。

于 2010-11-28T08:54:03.883 に答える
1

それはあなたが聞きたい答えではないかもしれませんが、一般的に、私があなたの立場にあるなら、SOAPから(たとえば、RESTスタイルのWebサービスに)切り替えることを検討します。

SOAP(およびWSDL、UDDI)を批判する記事は無数にあります-1、2、3などのいくつかを見たことがあるでしょう-実際、それらは少し古いですが、それでも非常に真実です。あなたは今、SOAPが非常に批判されていることを正確に経験しています-さまざまな実装の完全な複雑さと一般的な非互換性-特にクロスプラットフォーム。

于 2010-11-28T06:43:29.637 に答える
0

You DOT NET WEB SERVICEでは、以下の機能を参照してください。

[SoapRpcMethod]
[WebMethod]
public Complex GetComplex(string Name)
{
    Complex myObj = new Complex();
    if (Name == "" || Name == null ) Name = "empty param";
    myObj.name = "Return FRom My " + Name;
    myObj.value = 888;
    return myObj;
}

[SoapRpcMethod]リターンコンプレックスタイプのために使用する場合。あなたのJAVAプログラムで:

SoapObject rpc4 = new SoapObject(serviceNamespace, "GetComplex");

rpc4.addProperty("Name", "Johnson TONG");

以下のコードも機能しています

PropertyInfo pi = new PropertyInfo();
pi.name= "Name";
pi.type = PropertyInfo.STRING_CLASS;

rpc4.addProperty(pi, "Johnson");

int MyCount = rpc4.getPropertyCount();
SoapSerializationEnvelope envelope4 = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope4.bodyOut = rpc4;
envelope4.dotNet = false; // <--

envelope4.dotNet = true私が知らない理由で、これを使用しないでください。常にnull値がサーバーに渡されます。

envelope4.setOutputSoapObject(rpc4);
envelope4.addMapping("http://tempuri.org/encodedTypes", "Complex", new Complex().getClass());
HttpTransport ht4 = new HttpTransport(serviceUrl);
ht4.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
ht4.debug = true;
于 2011-01-12T12:15:05.470 に答える
0

ブールパラメータの問題に気づきました。あなたのコードには現在何も含まれていないことに気づきましたが、これは単なる注意事項です。ブール値をintに変更しました

于 2012-07-19T12:33:13.867 に答える
0

私の場合、RESTを使用するまで、SOAPを使用しようとして多くの時間を失い、多くのエラーが発生しました。

このリンクは、RESTを使用するためのチュートリアルにつながります

http://programmerguru.com/android-tutorial/android-restful-webservice-tutorial-how-to-call-restful-webservice-in-android-part-3/

于 2015-05-03T18:01:26.057 に答える