WCF:如何反序列化具有不同命名空间的SOAP消息的参数?

时间:2013-01-16 19:37:14

标签: c# wcf soap

我是WCF和Stackoverflow的新手。我正在尝试处理来自现有客户端的SOAP(1.2)请求。 消息如下:

<s:Body>
  <ns1:MyMethod>
    <ns1:Parameter1> A string value </ns1:Parameter1>
    <ns2:Parameter2> Another string value </ns2:Parameter2>
  </ns1:MyMethod>
</s:Body>

这是我的服务器端代码:

[SerivceContract(Namespace = "ns1...")]
public class IMyService
{
    [OperationContract(Action="http://the action url")]
    void MyMethod(string Parameter1, string Parameter2);
}

我可以正确地反序列化“Parameter1”,但“Parameter2”始终为null。我想这是因为不同的命名空间(ns1 vs ns2)。 有帮助吗?

2 个答案:

答案 0 :(得分:0)

必须创建服务以满足客户端已发送的请求,这是非常罕见的。

这就像试图购买一台支持15年前打印机驱动程序的新计算机一样。

解决方案:只需购买新打印机。

客户应该使用该服务,而不是相反。

感谢这并不直接回答您的问题,可能超出了解决方案的范围。

答案 1 :(得分:0)

这是一个老问题,但在试图找到类似问题的答案时我偶然发现了它。 Parameter1被反序列化而不是Parameter2的原因可能是因为两个字段都没有命名空间定义,所以它们从父节点(MyMethod)继承了命名空间。这也在this线程上解释。 对于当前情况,您需要使用自定义XmlSerializerFormat并将ns2名称空间添加到Param2:

[ServiceContract(Namespace = "http://ns1.com")]
[XmlSerializerFormat]
public interface IOpenInvoiceInterface
{
    [OperationContract]
    MyMethod Test(MyMethod req);
}

public class MyMethod
{
    [MessageBodyMember]
    public string Param1 { get; set; }

    [MessageBodyMember(Namespace = "http://ns2.com")]
    public string Param2 { get; set; }
}

使用此设置,将按预期反序列化以下调用:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ns1.com" xmlns:ns2="http://ns2.com">
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ns1:MyMethod >
        <ns1:Param1>abc</ns1:Param1>
        <ns2:Param2>cde</ns2:Param2>
    </ns1:MyMethod>
  </s:Body>
</s:Envelope>