在回叫时反序列化soap消息的问题

时间:2010-11-18 09:46:39

标签: c# java wcf web-services soap

我正在实现一个由另一个服务回调的WCF .NET服务 回叫服务发回的soap消息在

下面

SOAP消息

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"                
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
<ns1:getAccountBalance soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://service.company.x.y">
  <param0 xsi:type="xsd:string">123-K</param0>
  <param1 xsi:type="xsd:string">551003</param1>
  <param2 xsi:type="xsd:string">123</param2>
  <param3 xsi:type="xsd:string">1231</param3>
  <param4 xsi:type="xsd:string">ug</param4>
  <param5 xsi:type="xsd:string">x</param5>
  <param6 xsi:type="xsd:string">1.0</param6>
</ns1:getAccountBalance>
  </soapenv:Body>
</soapenv:Envelope>

收到垃圾的WCF合同

 [OperationContract(Action="")]
    AccountEnquiryResponse getAccountBalance(String param0, String param1, String param2, String param3, String param4, String param5, String param6);

服务招募

[ServiceBehavior(Namespace = "http://service.company.x.y")]
public class MyService:IService
{
    public AccountEnquiryResponse getAccountBalance(String param0, String param1, String param2, String param3, String param4, String param5, String param6)
    {
        return new AccountEnquiryResponse

问题

当回调返回时,WCF服务无法反序列化SOAP消息参数 - 它们都是 null

有效的肥皂消息

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<getAccountBalance xmlns="http://service.company.x.y">
  <param0>123</param0>
  <param1>123</param1>
  <param2>uid</param2>
  <param3>pwd</param3>
  <param4>en</param4>
  <param5>ug</param5>
  <param6>1.0</param6>
</getAccountBalance>
</s:Body>
</s:Envelope>

我的结论

有效的SOAP消息和无效的SOAP消息之间的区别是属性 soapenv:encodingStyle =“http://schemas.xmlsoap.org/soap/encoding/ ”和< em> xsi:type =“xsd:string 参数,.NET无法正确反序列化对象。

这是真的吗?

我该怎么做才能解决这个问题?

PS。回调给我的服务是用JAVA编写的第三方应用程序,我无法控制发送回应用程序的消息格式。

请告知

1 个答案:

答案 0 :(得分:0)

.Net是否具有在AccountEnquiryResponse对象上设置命名空间的属性?这将解决你的问题。

如果您是服务器,客户端使用什么来生成存根?你给他们一个wsdl?或者将它们指向正在运行的服务器?如果你给他们一个wsdl,你是否使用相同的wsdl来生成你的服务接口?

这看起来像 realy ,就像双方没有使用相同的界面一样。对于完全限定的名称,XML非常挑剔。