WSDL4J无法使用Basichttpbinding解析wcf .net服务响应

时间:2011-05-18 08:59:28

标签: java xml wcf

我正在尝试从JAVA代码(WSDL4J)调用.net wcf服务。但是WSDL4J无法解析.net服务的响应。我使用了basichttpbinding协议。

服务的实际响应-----

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <TestResponse xmlns="http://tempuri.org/">
         <TestResult>hi Test</TestResult>
      </TestResponse>
   </s:Body>
</s:Envelope>

我对此做了一些分析,发现如果响应是这样的话,WSDL4j工作正常 -

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <t:TestResponse xmlnst:t="http://tempuri.org/">
         <TestResult>hi Test</TestResult>
      </TestResponse>
   </s:Body>
</s:Envelope>

我的意思是如果以这种方式指定xml namespase,WSDL4J会正确解析.net响应。

所以问题是 - 我们如何修改.net响应以获得新的xml响应或我们可以做些什么更改,以便JAVA部分可以解析.net服务响应?

1 个答案:

答案 0 :(得分:1)

主要问题是WCDL4J似乎期望TestResult元素位于某个默认或空XML名称空间中,而位于“http://tempuri.org”名称空间中。 WCF服务生成的soap正确创建一个TestResponse元素,使其所有子元素位于同一XML命名空间中,并将默认XML命名空间重置为“http://tempuri.org”。

WSDL4J解析器似乎期望该命名空间仅适用于TestResponse元素而不适用于TestResult元素。这对我来说似乎是一个错误,但你可能无法做任何事情。

如果您还在阅读,有几种方法可以尝试解决此问题。快速&amp;简单的方法是强制WCF为它创建的所有soap body元素使用相同的XML命名空间。为服务的ServiceContract和DataMember属性执行此操作follow the advice in this MSDN post for XML namespaces。这可能会使WSDL4J解析器在使用您的命名空间而不是它使用的任何默认值时表现不同,但不能保证这将起作用。例如:

 [ServiceContract(Namespace = "http://YourCo/2011/05/18/YourDomain")]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }

 [DataContract(Namespace = "http://YourCo/2011/05/18/YourDomain")]
    public class Customer
    {
        [DataMember]
        public string Name {get; set;}
        [DataMember]
        public int ID {get; set;}
    }

如果这不起作用,那么你将不得不采用更为复杂的approach shown in the question & answer,但它允许你准确地制作肥皂信息。