【问题标题】:WCF: How to deserialize parameters of a SOAP message with different namespaces?WCF:如何反序列化具有不同命名空间的 SOAP 消息的参数?
【发布时间】:2013-01-16 19:37:14
【问题描述】:

我是 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”始终为空。我想这是因为不同的命名空间(ns1 vs ns2)。 有什么帮助吗?

【问题讨论】:

标签: c# wcf soap


【解决方案1】:

必须创建一个服务来满足客户端已经发送的请求是非常不寻常的。

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

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

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

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

【讨论】:

    【解决方案2】:

    这是一个老问题,但我在尝试寻找类似问题的答案时偶然发现了它。 反序列化 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      相关资源
      最近更新 更多