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

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

Примечание.

Изначально этот документ был написан для платформа .NET Framework 3.0. платформа .NET Framework 3.5 имеет встроенную поддержку работы с приложениями POX. Дополнительные сведения см. в статье о модели программирования ВЕБ-HTTP WCF.

Программирование POX с помощью WCF

Службы WCF, взаимодействующие по протоколу <HTTP с помощью сообщений POX, используют customBinding>.

<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-запроса, которое адресовано http://localhost:8100/customers.

Message request = Message.CreateMessage( MessageVersion.None, String.Empty );
request.Headers.To = "http://localhost:8100/customers";

HttpRequestMessageProperty property = new HttpRequestMessageProperty();
property.Method = "GET";
property.SuppressEntityBody = true;
request.Properties.Add( HttpRequestMessageProperty.Name, property );

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

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