这是我的第一篇文章。
我正在使用 post 构建一个 Restful wcf 服务来接受 XML 消息(从真实消息中截断)。由于消息使用命名空间的方式,我无法让 WCF 解析 XML。我无法更改 XML 消息的格式。
我在服务和数据契约上尝试了命名空间属性的各种组合,但要么得到解析错误,要么得到缺失或 NULL 的段。
如果我能够更改消息,我可以通过删除命名空间或将命名空间前缀应用于所有字段来使其工作。不幸的是,无法让供应商更改正在发送的消息的格式。
有没有办法让它与正在发送的消息一起工作。
sample 请求
<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 并将出站消息转换为您使用的任何传输协议(protocol)来隐藏这一点。
您最终可以创建自己的 message formatter .
“消息格式化程序是在 CLR 操作和 WCF 消息对象之间进行转换的组件——它们的作用是将所有操作参数和返回值(可能通过序列化)转换为输出消息,并将消息解构为参数并返回输入值。”
关于wcf - wcf Restful 服务的命名空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35729837/