2011-03-02 82 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。