.NET框架如何从邮件合同中创建SOAP消息?哪个序列化程序类用于序列化邮件合同?
答案 0 :(得分:10)
在封面下方,SOAP消息主要使用SerializeReply
类实现System.ServiceModel.Dispatcher.IDispatchMessageFormatter
接口的方法构造。有两个内部格式化程序使用XmlObjectSerializer
和XmlSerializer
实现来序列化邮件标题和正文。
幸运的是,还有另一个提供所需功能的公共课程。 TypedMessageConverter
在内部创建调度消息格式化程序,其方式与为调度操作设置的格式化程序类似。它在GetOperationFormatter
静态方法重载中使用私有Create
方法,以便创建内部System.ServiceModel.Description.XmlMessageConverter
类的实例。
创建TypedMessageConverter
实现实例后,可以将消息契约实例传递给ToMessage
方法。最后,在ToString
实例上调用Message
方法返回预期的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();
答案 1 :(得分:2)
这取决于您的配置。默认情况下,basicHttpBinding
和wsHttpBinding
使用DataContractSerializer类。就SOAP信封而言,我不知道使用了哪些类,我不确定它们是否公开(我可能错了)。
答案 2 :(得分:1)
据我所知,它不是由序列化程序直接使用的。它会创建Message
类型的内部结构,然后根据MessageVersion
并选择Encoder
来编写。
内部结构由TypedMessageConverter
准备。我认为这是一个负责消息合同处理的类。不幸的是,它是具有内部实现的抽象类。
因此,邮件合同适用于DataContractSerializer
和XmlSerializer
。
答案 3 :(得分:-1)
回答这个问题“我希望看到在消息合同被序列化/格式化时SOAP消息的样子”
您可以使用像Fiddler这样的工具,它可以让您了解通过网络传输的内容。在这里,您可以跟踪发送的实际消息xml。