【问题标题】:Namespace issue with wcf Restful servicewcf Restful 服务的命名空间问题
【发布时间】:2016-06-14 06:42:57
【问题描述】:

这是我的第一篇文章。 我正在使用 post 构建一个安静的 wcf 服务来接受 XML 消息(从真实消息中截断)。由于消息使用命名空间的方式,我无法让 WCF 解析 XML。我无法更改 XML 消息的格式。 我在服务和数据合同上尝试了命名空间属性的各种组合,但要么得到解析错误,要么得到缺失的段或 NULL。 如果我能够更改消息,我可以通过删除命名空间或将命名空间前缀应用于所有字段来使其工作。遗憾的是,无法让供应商更改所发送消息的格式。

有没有办法让它与正在发送的消息一起工作。

样品申请

   <m:MYMESSAGE xmlns:m="my.report">
        <MESSAGEHEADER>
            <MESSAGETYPE>GoodReport</MESSAGETYPE>
            <MESSAGEDATE>20160203134445</MESSAGEDATE>
            <MESSAGEACTION>UPDATE</MESSAGEACTION>
        </MESSAGEHEADER>
        <PATIENT>
            <LASTNAME>Last</LASTNAME>
            <FIRSTNAME>First</FIRSTNAME>
            <MIDDLENAME>Middlename</MIDDLENAME>
        </PATIENT>
    </m:MYMESSAGE>

示例错误响应

<MYMESSAGE xmlns="my.report" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
   <MESSAGEHEADER i:nil="true"/>
   <PATIENT i:nil="true"/>
 </MYMESSAGE>

WCF 代码

  [ServiceContract]
    public interface IPDF
    {
        [OperationContract ]
        [WebInvoke(Method = "POST",
            ResponseFormat = WebMessageFormat.Xml,
            RequestFormat = WebMessageFormat.Xml
           )]
        MYMESSAGE GetPdf(MYMESSAGE mymessage);

    }

  [DataContract(Name = "MYMESSAGE", Namespace = "my.report")]
        public class MYMESSAGE
        {
            [DataMember (Name ="MESSAGEHEADER",Order=0)  ]
            public _MESSAGEHEADER MESSAGEHEADER { get; set; }
            [DataMember(Name = "PATIENT", Order = 1)]
            public _PATIENT PATIENT { get; set; }

        }

        [DataContract(Namespace = "my.report")]
        public class _MESSAGEHEADER
        {
            [DataMember(Name = "MESSAGETYPE", Order = 0)]
            public string MESSAGETYPE { get; set; }
            [DataMember(Name = "MESSAGEDATE", Order = 1)]
            public string MESSAGEDATE { get; set; }


          }

【问题讨论】:

    标签: wcf namespaces wcf-rest


    【解决方案1】:

    您可以使用Message Contracts 来创建您需要的消息形状。例如:

    [MessageContract]
    public class BankingTransaction
    {
      [MessageHeader] public Operation operation;
      [MessageHeader(Namespace="http://schemas.contoso.com/auditing/2005")] public bool IsAudited;
      [MessageBodyMember(Name="transactionData")] public BankingTransactionData theData;
    }) 
    

    WCF 使用基于 SOAP 的消息,但 WCF 内部可以通过将入站消息转换为 SOAP 并将出站消息转换为您使用的任何传输协议来隐藏这一点。

    您最终可以创建自己的message formatter

    “消息格式化程序是在 CLR 操作和 WCF 消息对象之间进行转换的组件 - 它们的作用是将所有操作参数和返回值(可能通过序列化)转换为输出消息,并将消息解构为输入时的参数和返回值。”

    【讨论】:

    • 我尝试了 MessageContract 但到目前为止没有运气。我可以在服务合同上放置一个命名空间,但 MessageBodyMemeber 似乎没有自己的命名空间属性。我得到这个回应。 &lt;MYMESSAGE xmlns="my.report"&gt; &lt;MESSAGEHEADER i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/&gt; &lt;PATIENT i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/&gt; &lt;ATTACHMENT i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/&gt; &lt;CONTENT i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/&gt; &lt;/MYMESSAGE&gt;
    • RESTFUL 服务是否支持 MessageContract?它似乎更面向 SOAP。
    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 2011-09-30
    • 1970-01-01
    • 2019-04-13
    • 2021-12-28
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多