2011-03-02 74 views
5

.NET框架如何从消息合约创建SOAP消息?哪个串行器类用于序列化消息合约?将消息合约转换为SOAP消息

+0

你为什么想知道?你想完成什么? – 2011-03-03 01:36:22

+1

@John Saunders:我想知道当消息协定被序列化/格式化时,SOAP消息的外观如何。经过一番挖掘,我发现这个班级实际上可以帮助我实现这一目标,而不用通过电报发送信息。 'TypedMessageConverter'类有几个'Create'静态方法重载,它们返回一个从'TypedMessageConverter'继承的类的实例。我可以将消息合约实例传递给它的一个ToMessage方法重载,并在返回的Message上调用ToString方法来实现我真正想要的。我会在今天的某个时间发布这个例子 – 2011-03-03 01:45:21

回答

10

深度覆盖下,SOAP消息主要使用SerializeReply类的方法实现System.ServiceModel.Dispatcher.IDispatchMessageFormatter接口。有两个内部格式化程序使用XmlObjectSerializerXmlSerializer实现来序列化消息标题和正文。

幸运的是,还有一个公共类提供了所需的功能。 TypedMessageConverter内部创建的调度消息格式化程序与调度程序的格式化程序设置类似。它使用私有的GetOperationFormatter方法中的Create静态方法重载,以创建内部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(); 
2

这将取决于您的配置。默认basicHttpBindingwsHttpBinding使用DataContractSerializer类。就SOAP包络而言,我不知道使用了哪些类,我不确定它们是否会公开(我可能在这方面是错误的)。

1

据我所知,它并不是直接被序列化器使用。它创建Message类型的内部结构,然后根据MessageVersion和选定的Encoder编写。

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

因此,邮件合同与DataContractSerializerXmlSerializer一起使用。

-1

要回答这个问题:“我想看看SOAP消息将如何看待时,消息协定序列化/格式化,如”

您可以像使用Fiddler一个工具,它可以让你看到怎么回事了电线。在这里,您可以跟踪正在发送的实际消息xml。