Глубоко под крышкой, сообщение 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();