Перевод контракта сообщения в сообщение SOAP - PullRequest
5 голосов
/ 03 марта 2011

Как .NET framework создает SOAP-сообщение из сообщения-контракта?Какой класс сериализатора используется для сериализации контракта сообщений?

Ответы [ 4 ]

10 голосов
/ 03 марта 2011

Глубоко под крышкой, сообщение 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();
2 голосов
/ 03 марта 2011

Это будет зависеть от вашей конфигурации. По умолчанию basicHttpBinding и wsHttpBinding используют класс DataContractSerializer . Что касается конвертов SOAP, я не знаю, какие классы используются, и я не уверен, будут ли они публичными (я могу ошибаться в этом).

1 голос
/ 03 марта 2011

Как я понимаю, он не используется напрямую сериализатором. Он создает внутреннюю структуру типа Message, которая затем записывается на основе MessageVersion и выбирается Encoder.

Внутренняя структура подготовлена ​​TypedMessageConverter. Я думаю, что это класс, ответственный за обработку контрактов сообщений. К сожалению, это абстрактный класс с внутренней реализацией.

Из-за этого контракты сообщений работают как с DataContractSerializer, так и с XmlSerializer.

0 голосов
/ 10 августа 2011

Чтобы ответить на вопрос «Я хотел посмотреть, как будет выглядеть сообщение SOAP при сериализации / форматировании контракта сообщения»

Вы можете использовать такой инструмент, как Fiddler , который позволяет вам видеть, что происходит по проводам. Здесь вы можете отследить фактическое сообщение xml, отправляемое через.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...