0

我正在使用 ksoap 连接到 Android 上的 CrmDiscoveryService,问题来了:

SoapFault - 故障代码:'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 ://seesharpgears.blogspot.com/2010/10/ksoap-android-web-service-tutorial-with.html 。我从把头撞在键盘上,到阅读本教程并让我的代码首先尝试工作(这永远不会发生!)。

祝你好运,如果您需要更多帮助,请发布!=)

  • 乔伊
于 2012-08-14T06:59:01.273 回答