Поделиться через


Взаимодействие с приложениями POX

Приложения типа "Plain Old XML" (POX) взаимодействуют путем обмена необработанными сообщениями HTTP, содержащими только данные приложения XML, не заключенные в конверт SOAP. Windows Communication Foundation (WCF) может предоставлять как службы, так и клиенты, использующие сообщения POX. В случае службы WCF может использоваться для реализации служб, предоставляющих конечные точки таким клиентам, как веб-браузеры и языки сценариев, которые передают и принимают сообщения POX. В случае клиента модель программирования WCF может использоваться для реализации клиентов, взаимодействующих со службами, основанными на POX.

Aa738456.note(ru-ru,VS.100).gif
Данный документ первоначально был написан для .NET Framework 3.0. В .NET Framework 3.5 имеется встроенная поддержка приложений POX. Дополнительные сведения см. в разделе Модель веб-программирования HTTP WCF

Программирование POX с использованием WCF

В службах WCF, взаимодействующих по HTTP с помощью сообщений POX, используется элемент customBinding element.

<customBinding>
   <binding name="poxServerBinding">
       <textMessageEncoding messageVersion="None" />
       <httpTransport />
   </binding>
</customBinding>

Эта пользовательская привязка содержит два элемента:

Стандартный кодировщик текстовых сообщений WCF специально настроен для использования значения None, которое позволяет обрабатывать полезную нагрузку сообщений XML, поступающую не внутри конвертов SOAP.

Клиенты WCF, взаимодействующие по протоколу HTTP с помощью сообщений POX, используют аналогичную привязку (показанную в приведенном ниже императивном коде).

private static Binding CreatePoxBinding()
{
    TextMessageEncodingBindingElement encoder = 
    new TextMessageEncodingBindingElement( MessageVersion.None, Encoding.UTF8 );
    HttpTransportBindingElement transport = new HttpTransportBindingElement();
    transport.ManualAddressing = true;
    return new CustomBinding( new BindingElement[] { encoder, transport } );
} 

Так как клиенты POX должны явно задавать универсальные коды ресурса (URI), которым они отправляют сообщения, им обычно требуется настроить для элемента HttpTransportBindingElement режим ручной адресации, задав в этом элементе для свойства ManualAddressing значение true. Это обеспечивает явную адресацию сообщений в коде приложения, исключая необходимость создавать новую фабрику ChannelFactory каждый раз, когда приложение передает сообщение другому универсальному коду ресурса (URI) протокола HTTP.

Так как сообщения POX не используют заголовки SOAP для передачи важной информации о протоколе, клиенты и службы POX часто должны обрабатывать части базового запроса HTTP, использованного для отправки или приема сообщения. Специфичная для HTTP информация о протоколе, такая как заголовки HTTP и коды состояния, отображается в модели программирования WCF с помощью двух классов.

  • HttpRequestMessageProperty, содержащий информацию о запросе HTTP, такую как метод HTTP и заголовки запроса.

  • HttpResponseMessageProperty, содержащий информацию об ответе HTTP, такую как код состояния и описание состояния HTTP, а также все заголовки ответа HTTP.

В следующем примере кода показано, как создать сообщения запроса HTTP GET, направляемое по адресу https://localhost:8100/customers.

Message request = Message.CreateMessage( MessageVersion.None, String.Empty );
request.Headers.To = “https://localhost:8100/customers”;
 
HttpRequestMessageProperty property = new HttpRequestMessageProperty();
property.Method = “GET”;
property.SuppressEntityBody = true;
request.Properties.Add( HttpRequestMessageProperty.Name, property );

Сначала создается пустой запрос Message путем вызова метода CreateMessage. Параметр None используется для указания того, что конверт SOAP не требуется, а параметр Empty передается как действие. Затем сообщение запроса адресуется путем задания в заголовке To требуемого универсального кода ресурса (URI). Далее создается HttpRequestMessageProperty, для параметра Method задается HTTP-команда GET, а для параметра SuppressEntityBody задается значение true, указывающее, что в теле исходящего сообщения запроса HTTP не должны передаваться никакие данные. Наконец, в коллекцию Properties сообщения запроса добавляется свойство запроса, чтобы можно было влиять на способ передачи запроса транспортом HTTP. После этого сообщение готово к отправке через соответствующий экземпляр класса IRequestChannel.

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

См. также

Другие ресурсы

REST and POX