【问题标题】:Change URN in node element WCF更改节点元素 WCF 中的 URN
【发布时间】:2015-09-02 23:44:37
【问题描述】:

每个人。 我正在开发一个使用消息合约和 wcf 的 URN 的遗留服务,我有这个小但非常棘手的不便。

 <soapenv:Envelope      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:UMARKETSPIWS:v2" xmlns:gps="http://schemas.datacontract.org/2004/07/GPS">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:CreditAirtime>
         <!--Optional:-->
         <urn:transactionId>321321</urn:transactionId>
         <!--Optional:-->
         <urn:extraParameters>
            <!--Zero or more repetitions:-->
            <gps:KeyValuePairs>
               <!--Optional:-->
               <gps:key>?</gps:key>
               <!--Optional:-->
               <gps:value>?</gps:value>
            </gps:KeyValuePairs>
         </urn:extraParameters>
         <!--Optional:-->
         <urn:msisdn>50370823063</urn:msisdn>
         <!--Optional:-->
         <urn:amount>5</urn:amount>
      </urn:CreditAirtime>
   </soapenv:Body>
</soapenv:Envelope>

我想在 extraParameters 部分示例中将 gps: 标签更改为 urn::

 <soapenv:Envelope      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:UMARKETSPIWS:v2" xmlns:gps="http://schemas.datacontract.org/2004/07/GPS">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:CreditAirtime>
         <!--Optional:-->
         <urn:transactionId>321321</urn:transactionId>
         <!--Optional:-->
         <urn:extraParameters>
            <!--Zero or more repetitions:-->
            <urn:KeyValuePairs>
               <!--Optional:-->
               <urn:key>?</gps:key>
               <!--Optional:-->
               <urn:value>?</gps:value>
            </urn:KeyValuePairs>
         </urn:extraParameters>
         <!--Optional:-->
         <urn:msisdn>50370823063</urn:msisdn>
         <!--Optional:-->
         <urn:amount>5</urn:amount>
      </urn:CreditAirtime>
   </soapenv:Body>
</soapenv:Envelope>

我已经尝试通过添加 [MessageBodyMember(Name = "key", Order = 0,Namespace = "urn:")] 并且似乎工作不正常,其他一切工作正常,但我真的不知道在哪里从这个开始。

接口和类在这里。 http://pastebin.com/dtjmXQaz

【问题讨论】:

  • 命名空间应该是"urn:UMARKETSPIWS:v2" 而不是"urn:"urn: 只是对实际命名空间的查找 prefix。除此之外,你能分享你的课程吗,包括KeyValuePairsextraParameters
  • 已经更正了 urn 命名空间,但仍然可以修改 keyvalupairs 的命名空间,这里是接口和类pastebin.com/dtjmXQaz 谢谢。

标签: c# xml wcf serialization soap


【解决方案1】:

MessageContract 属性仅控制与 SOAP 消息信封相对应的类型的 SOAP 格式——这是直接出现在您的OperationContract 中的类型之一。对于未映射到 SOAP 消息但仅由根消息类型引用的类型,您需要使用 data contract attributes。因此:

    [DataContract(Namespace = "urn:UMARKETSPIWS:v2")]
    public class KeyValuePair
    {
        [DataMember(Name = "key", Order = 0)]
        public string key { get; set; }

        [DataMember(Name = "value", Order = 1)]
        public string value { get; set; }
    }

事实上,对于不需要精确控制 SOAP 消息格式或安全性的简单消息,您通常可以只使用数据协定属性。请参阅Using Message ContractsSpecifying Data Transfer in Service Contracts

【讨论】:

  • 非常感谢,现在我明白这两种合同的区别了
猜你喜欢
  • 2018-11-28
  • 2018-12-30
  • 2013-04-13
  • 2023-03-30
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多