0

ksoap を使用して Android の CrmDiscoveryService に接続していますが、ここで問題が発生します。

SoapFault - faultcode: 'soap:server' faultstring: 'サーバーはリクエストを処理できませんでした.' faultactor: 'null' 詳細: org.kxml2.kdom.Node@4061bd00

//here is namespace,endpoint,soapaction and methodname

public final static String DISCOVERY_NAMESPACE = "http://schemas.microsoft.com/crm/2007/CrmDiscoveryService/";

public final static String DISCOVERY_ENDPOINT_URL = "https://dev.crm5.dynamics.com/MSCRMServices/2007/Passport/CrmDiscoveryService.asmx";

public final static String SOAPACTION = "http://schemas.microsoft.com/crm/2007/CrmDiscoveryService/Execute";

private String MethodName = "Execute";

//below is the code connectting to crmdiscoveryservice

SoapObject rpc = new SoapObject(DISCOVERY_NAMESPACE, MethodName);

RetrievePolicyRequest retrievePolicyRequest = new RetrievePolicyRequest();

PropertyInfo info = new PropertyInfo();

info.name = "parameters";
info.type = retrievePolicyRequest.getClass();
info.setValue(retrievePolicyRequest);
rpc.addProperty(info);

HttpTransportSE ht = new HttpTransportSE(DISCOVERY_ENDPOINT_URL);

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.dotNet = true;
envelope.encodingStyle = "utf-8";
envelope.setOutputSoapObject(rpc);

try {
    ht.call(SOAPACTION, envelope);

    if (envelope.getResponse() != null) {
        SoapPrimitive response = (SoapPrimitive) envelope.bodyIn;
        Log.e(tag, response.toString());
    }

} catch (IOException e) {
         e.printStackTrace();
} catch (XmlPullParserException e) {
    e.printStackTrace();
}

そして、RetrievePolicyRequest を自分で定義しました。私は何度も試しましたが、まだこの問題があります。この問題を解決する方法を知っている人はいますか?

ありがとうございました!

4

1 に答える 1

0

以下は、コードで問題が発生する可能性があると思われるものです。

  1. 間違った propertyinfo.name を使用している可能性があります。たとえば、htt(REMOVE THIS)ps://dev.crm5.dynamics.com/MSCRMServices/2007/Passport/CrmDiscoveryService.asmx?WSDL を見ると、確かにあなたが望むように見えますinfo.name = "Request";。これが実際に当てはまる場合は、複合型クラスもリクエストになるように変更する必要があります。

  2. これでプロパティのタイプとしてクラスを追加していますがinfo.type = retrievePolicyRequest.getClass();(何らかの理由でまだ理解できていません)、十分ではありません。また、このクラスをエンベロープに「マップ」する必要があります。持つべきという意味

    envelope.dotNet = "true";
    envelope.encodingStyle = "utf-8";
    envelope.setOutputSoapObject(rpc);
    envelope.addMapping(DISCOVERY_NAMESPACE, "Request", new Request().getClass());
    

これらは私がすぐに目にするものであり、間違いなくあなたを助けるいくつかのものがあります(このようなソープコールで私を大いに助けてくれました)。

まず、soapUI を確認する必要があります。14 日間のトライアルを開始できます。これにより、soapUI を wsdl url に向けることができ、メソッド呼び出しをテストできるようになります (したがって、リクエストがどのように見えるべきかを簡単に確認でき、返された xml がどのように見えるかを確認することもできます)。http://www.soapui.org/。このプログラムは、メソッドが何であるか、名前空間が何であるか、URL が何であるか、soap11 または soap12 を使用しているかどうかなどを文字どおり綴ります。

次に、このような複雑な型については、次のチュートリアルを参照してください: http://seesharpears.blogspot.com/2010/10/ksoap-android-web-service-tutorial-with.html。私は頭をキーボードにぶつけてから、このチュートリアルを読んで、コードを最初に試してみることにしました (それは決して起こりません!)。

頑張ってください。さらにサポートが必要な場合は、投稿してください。=)

  • ジョーイ
于 2012-08-14T06:59:01.273 に答える