2016-03-01 26 views
1

這是我的第一篇文章。 我正在構建一個安靜的wcf服務,使用post來接受XML消息(從真正的截斷的)。由於消息使用名稱空間的方式,我無法讓WCF解析XML。我無法更改XML消息的格式。 我已經嘗試了服務和datacontract上的名稱空間屬性的各種組合,但要麼得到一個解析錯誤或缺少或NULL的段。 如果我能夠改變消息,我可以通過刪除命名空間或將命名空間前綴應用於所有字段來使其工作。不幸的是,供應商不可能改變正在發送的消息的格式。wcf的命名空間問題Restful服務

有沒有辦法讓這個與發送的消息一起工作。

樣品申請

<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; } 


      } 

回答

0

您可以使用Message Contracts創建你所需要的信息的形狀。對於eaxample:

[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消息對象之間進行轉換的組件 - 它們的作用是將所有操作參數和返回值(可能通過序列化)轉換爲輸出消息,並解構消息輸入參數和返回值「。

+0

我試過了MessageContract,但到目前爲止沒有運氣。我可以在服務合同上放置一個名稱空間,但MessageBodyMemeber似乎沒有自己的名稱空間屬性。我得到這個迴應。 < ' – David

+0

Is MessageContract支持RESTFUL服務?看起來更加面向SOAP。 – David