C# 消息契约到SOAP消息的转换

C# 消息契约到SOAP消息的转换,c#,.net,wcf,serialization,soap,C#,.net,Wcf,Serialization,Soap,NET framework如何从消息契约创建SOAP消息?哪个序列化程序类用于序列化消息协定?这将取决于您的配置。默认情况下,basicHttpBinding和wsHttpBinding使用该类。就SOAP信封而言,我不知道使用的是什么类,也不确定它们是否是公共的(我可能在这一点上错了)。据我所知,序列化程序并不直接使用它。它创建消息类型的内部结构,然后根据消息版本写入该结构,并选择编码器 内部结构由TypedMessageConverter准备。我认为它是一个负责消息契约处理的类。不幸的是,它

NET framework如何从消息契约创建SOAP消息?哪个序列化程序类用于序列化消息协定?

这将取决于您的配置。默认情况下,
basicHttpBinding
wsHttpBinding
使用该类。就SOAP信封而言,我不知道使用的是什么类,也不确定它们是否是公共的(我可能在这一点上错了)。

据我所知,序列化程序并不直接使用它。它创建
消息
类型的内部结构,然后根据
消息版本
写入该结构,并选择
编码器

内部结构由
TypedMessageConverter
准备。我认为它是一个负责消息契约处理的类。不幸的是,它是具有内部实现的抽象类


正因为如此,消息契约与
DataContractSerializer
XmlSerializer
一起工作。在底层,SOAP消息主要是使用类实现
System.ServiceModel.Dispatcher.IDispatchMessageFormatter
接口的
SerializeReply
方法构建的。有两个内部格式化程序使用
XmlObjectSerializer
XmlSerializer
实现来序列化消息头和消息体

幸运的是,还有另一个公共类提供了所需的功能。
TypedMessageConverter
以类似于为分派操作设置的格式化程序的方式在内部创建分派消息格式化程序。它使用
Create
静态方法重载中的private
GetOperationFormatter
方法来创建内部
System.ServiceModel.Description.XmlMessageConverter
类的实例

创建
TypedMessageConverter
实现实例后,可以将消息契约实例传递到
ToMessage
方法中。最后,调用
Message
实例上的
ToString
方法返回预期的SOAP消息字符串

TypedMessageConverter converter = TypedMessageConverter.Create(
    typeof( CustomMessage ),
    "http://schemas.cyclone.com/2011/03/services/Service/GetData",
    "http://schemas.cyclone.com/2011/03/data",
    new DataContractFormatAttribute() { Style = OperationFormatStyle.Rpc } );
CustomMessage body = new CustomMessage()
{
    // Setting of properties omitted
};
Message message = converter.ToMessage( body, MessageVersion.Soap12 );
string soapMessage = message.ToString();
回答问题“我想看看当消息契约被序列化/格式化时SOAP消息会是什么样子”


你可以使用这样的工具,让你看到电线上发生了什么。在这里,您可以跟踪发送的实际消息xml。

您为什么想知道?您希望完成什么?@johnsaunders:我想看看当消息契约被序列化/格式化时,SOAP消息会是什么样子。经过一些挖掘,我找到了一个可以帮助我实现这一目标的类,而无需通过网络发送信息
TypedMessageConverter
类有几个
Create
静态方法重载,返回从
TypedMessageConverter
继承的类的实例。我可以将消息契约实例传递给它的
ToMessage
方法重载之一,并对返回的
message
调用
ToString
方法来实现我真正想要的。今天某个时候我会发布这个例子