wcf Restful 服务的命名空间问题
Namespace issue with wcf Restful service
这是我的第一个 post。
我正在构建一个 restful wcf 服务,使用 post 来接受 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; }
}
您可以使用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。
"Message formatters are the component which do the translation between CLR operations and the WCF Message object – their role is to convert all the operation parameters and return values (possibly via serialization) into a Message on output, and deconstruct the message into parameter and return values on input."
这是我的第一个 post。 我正在构建一个 restful wcf 服务,使用 post 来接受 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; }
}
您可以使用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。
"Message formatters are the component which do the translation between CLR operations and the WCF Message object – their role is to convert all the operation parameters and return values (possibly via serialization) into a Message on output, and deconstruct the message into parameter and return values on input."