Взаимодействие с приложениями 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, каждый раз, когда приложение отправляет сообщение на другой HTTP URI.

Так как сообщения 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 из входящего сообщения и создания ответа.