Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Приложения "Обычный старый 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 из входящего сообщения и создания ответа.