wcf Restful服务的命名空间问题

时间:2016-03-01 17:48:29

标签: wcf namespaces wcf-rest

这是我的第一篇文章。 我正在使用post构建一个restful wcf服务来接受XML消息(从真实消息中截断)。由于消息使用命名空间的方式,我无法让WCF解析XML。我无法更改XML消息的格式。 我在服务和datacontract上尝试了各种命名空间属性组合,但要么得到解析错误,要么得到丢失的段或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; }


          }

1 个答案:

答案 0 :(得分:0)

您可以使用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的Message,但WCF内部可以通过将入站消息转换为SOAP和出站消息来隐藏它,这些消息是您正在使用的传输协议。

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

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