我正在尝试从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服务响应?
答案 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,但它允许你准确地制作肥皂信息。