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


Общие сведения о модели программирования WCF Web HTTP

Модель программирования WINDOWS Communication Foundation (WCF) WEB HTTP предоставляет основные элементы, необходимые для создания веб-служб HTTP с помощью WCF. Службы WCF WEB HTTP предназначены для доступа к наиболее широкому спектру возможных клиентов, включая веб-браузеры, и имеют следующие уникальные требования:

  • URI и URI-коды обработки URI играют центральную роль в проектировании веб-служб HTTP. Модель программирования WCF WEB HTTP использует UriTemplate и UriTemplateTable классы для предоставления возможностей обработки URI.

  • Поддержка операций GET и POST WEB HTTP использует команду GET для извлечения данных, а также различные команды вызова для изменения данных и удаленного вызова. Модель программирования WCF WEB HTTP использует WebGetAttributeWebInvokeAttribute операции службы как с GET, так и с другими http-командами, такими как PUT, POST и DELETE.

  • Несколько форматов данных веб-стиле служб обрабатывают множество типов данных в дополнение к сообщениям SOAP. Модель программирования WCF WEB HTTP использует WebHttpBinding и WebHttpBehavior поддерживает различные форматы данных, включая XML-документы, объект данных JSON и потоки двоичного содержимого, такие как изображения, видеофайлы или обычный текст.

Модель программирования WCF WEB HTTP расширяет охват WCF для покрытия сценариев веб-стиля, которые включают веб-службы HTTP, службы AJAX и JSON и веб-каналы Syndication (ATOM/RSS). Дополнительные сведения о службах AJAX и JSON см. в разделе "Интеграция AJAX" и "Поддержка JSON". Дополнительные сведения о Синдикации см. в обзоре syndication WCF.

Какие-либо дополнительные ограничения на типы данных, которые могут быть возвращены из веб-службы HTTP, отсутствуют. При работе веб-службы HTTP могут быть возвращены любые сериализуемые данные. Операции веб-службы HTTP могут быть вызваны веб-браузером, поэтому предусмотрены ограничения, касающиеся того, какие типы данных могут указываться в URL-адресах. Дополнительные сведения о типах, поддерживаемых по умолчанию, см . в разделе UriTemplate Query String Parameters and URL-адреса ниже. Это поведение по умолчанию можно изменить, предоставив собственную реализацию объекта T:System.ServiceModel.Dispatcher.QueryStringConverter, которая определяет, как преобразовывать параметры, заданные в URL-адресе, в фактические типы параметров. Дополнительные сведения см. в разделе QueryStringConverter.

Внимание

Службы, написанные с помощью модели программирования WCF WEB HTTP, не используют сообщения SOAP. Так как ПРОТОКОЛ SOAP не используется, нельзя использовать функции безопасности, предоставляемые WCF. Однако можно использовать безопасность уровня транспорта, разместив службу через HTTPS. Дополнительные сведения о безопасности WCF см. в разделе "Общие сведения о безопасности"

Предупреждение

Установка расширения WebDAV для служб IIS может привести к тому, что веб-службы HTTP будут возвращать ошибку HTTP 405, поскольку расширение WebDAV пытается обрабатывать все запросы PUT. Для решения этой проблемы расширение WebDAV можно удалить либо отключить его для данного веб-узла. Дополнительные сведения см. в разделе IIS и WebDav

Обработка универсального кода ресурса (URI) с помощью UriTemplate и UriTemplateTable

Шаблоны URI предоставляют эффективный синтаксис представления больших наборов URI или схожих по структуре URI. Например, следующий шаблон представляет набор всех трехсегментных URI, начинающихся с "a" и заканчивающихся на "c", независимо от значения промежуточного сегмента: a/{segment}/c.

Данный шаблон описывает универсальные коды ресурса, подобные следующим:

  • a/x/c

  • a/y/c

  • a/z/c

  • и другие возможности.

В этом шаблоне запись в фигурных скобках ("{segment}") обозначает переменный сегмент, а не литеральное значение.

Платформа .NET Framework предусматривает API для работы с шаблонами URI, который называется UriTemplate. UriTemplates позволяет выполнять следующие действия.

  • Можно вызвать один из Bind методов с набором параметров, чтобы создать полностью закрытый универсальный код ресурса (URI ), соответствующий шаблону. Это означает, что все переменные в шаблоне URI заменяются фактическими значениями.

  • Можно вызвать Match() с потенциальным URI, который использует шаблон для разбиения потенциального URI на составные части и возвращает словарь, содержащий различные части URI, помеченные в соответствии с переменными в шаблоне.

  • Bind() и Match() являются инверсиями, поэтому можно вызвать Match( Bind( x ) ) и вернуться к той среде, в которой была начата работа.

Очень часто (особенно на стороне сервера, где необходимо направить запрос операции службы на основе URI), бывает необходимо отслеживать набор объектов UriTemplate в структуре данных, которые могут независимо обращаться к каждому из включенных шаблонов. UriTemplateTable представляет набор шаблонов URI и выбирает самый подходящий заданный набор шаблонов и потенциальный URI. Это не связано с определенным сетевым стеком (включенным WCF), поэтому его можно использовать везде, где это необходимо.

Для связывания операций службы с набором URI, который описывается шаблоном UriTemplate, модель службы WCF использует шаблон UriTemplateTable и таблицу шаблонов UriTemplate. Операция службы связывается с шаблоном UriTemplate с помощью атрибута WebGetAttribute или WebInvokeAttribute. Дополнительные сведения и сведения см. в UriTemplateUriTemplateTableразделе UriTemplate и UriTemplateTable

Атрибуты WebGet и WebInvoke

Службы WCF WEB HTTP используют глаголы извлечения (например, HTTP GET) в дополнение к различным командам вызова (например, HTTP POST, PUT и DELETE). Модель программирования WCF WEB HTTP позволяет разработчикам служб управлять шаблоном URI и командой, связанной с операциями службы с WebGetAttribute ними и WebInvokeAttribute. Атрибуты WebGetAttribute и WebInvokeAttribute позволяют управлять привязкой отдельных операций к URI и методам HTTP, связанным с этими URI. Например, добавление атрибутов WebGetAttribute и WebInvokeAttribute продемонстрировано в следующем примере кода.

[ServiceContract]
interface ICustomer
{
  //"View It"

  [WebGet]
  Customer GetCustomer():

  //"Do It"
    [WebInvoke]
  Customer UpdateCustomerName( string id,
                               string newName );
}

Предыдущий код позволяет создавать следующие HTTP-запросы.

GET /GetCustomer

POST /UpdateCustomerName

Атрибут WebInvokeAttribute по умолчанию имеет значение POST, но его можно использовать и для других команд.

[ServiceContract]
interface ICustomer
{
  //"View It" -> HTTP GET
    [WebGet( UriTemplate="customers/{id}" )]
  Customer GetCustomer( string id ):

  //"Do It" -> HTTP PUT
  [WebInvoke( UriTemplate="customers/{id}", Method="PUT" )]
  Customer UpdateCustomer( string id, Customer newCustomer );
}

Полный пример службы WCF, использующего модель программирования WCF WEB HTTP, см. в статье "Практическое руководство. Создание базовой веб-службы WCF Web HTTP"

Параметры строки запроса UriTemplate и URL-адреса

Веб-службы можно вызвать из веб-браузера, введя URL-адрес, связанный с операцией службы. Эти операции службы могут принимать параметры строки запроса, которые необходимо указывать в URL-адресе в строковом формате. В таблице ниже представлены типы, которые могут передаваться внутри URL-адреса и используемого формата.

Тип Формат
Byte 0–255
SByte -128 - 127
Int16 -32768 - 32767
Int32 -2,147,483,648 - 2,147,483,647
Int64 -9 223 372 036 854 775 808 – 9 223 372 036 854 775 807
UInt16 0 - 65535
UInt32 0 - 4,294,967,295
UInt64 0 - 18,446,744,073,709,551,615
Single -3.402823e38–3.402823e38 (экспоненциальная запись не требуется)
Double -1.79769313486232e308–1.79769313486232e308 (экспоненциальная запись не требуется)
Char Любой одиночный символ
Decimal Любое десятичное число в стандартной записи (без экспоненты)
Boolean True или False (с учетом регистра)
String Любая строка (пустая строка не поддерживается, преобразование не производится)
DateTime MM/DD/YYYY

MM/DD/ГГГГ ЧЧ:ММ:SS [AM|PM]

Месяц, день, год

Год месяца HH:MM:SS [AM|PM]
TimeSpan ДД.ЧЧ:ММ:СС,

где ДД = дни, ЧЧ = часы, ММ = минуты, СС = секунды.
Guid Например, идентификатор GUID:

936DA01F-9ABD-4d9d-80C7-02AF85C822A8
DateTimeOffset ММ/ДД/ГГГГ ЧЧ:ММ:СС ММ:СС,

где ДД = дни, ЧЧ = часы, ММ = минуты, СС = секунды.
Перечисления Значение перечисления, которое, например, определяет перечисление, как показано в следующем примере кода.

public enum Days{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

В строке запроса можно указать любое отдельное значение перечисления (или соответствующее ему целочисленное значение).
Типы, содержащие TypeConverterAttribute, который может преобразовать типы в строковое представление и обратно. Зависит от преобразователя типов.

Форматы и модель программирования WCF WEB HTTP

Модель программирования WCF WEB HTTP имеет новые возможности для работы с различными форматами данных. На уровне привязки WebHttpBinding может считывать и записывать следующие различные типы данных.

  • XML

  • JSON

  • Непрозрачные двоичные потоки

Это означает, что модель программирования WCF WEB HTTP может обрабатывать любые типы данных, но вы можете использовать программирование.Stream

платформа .NET Framework 3.5 поддерживает данные JSON (AJAX), а также каналы Синдикации (включая ATOM и RSS). Дополнительные сведения об этих функциях см. в статье WCF Web HTTP Formatting, WCF Syndication Overview, and AJAX Integration and JSON Support.

Модель программирования WCF WEB HTTP и безопасность

Так как модель программирования WCF WEB HTTP не поддерживает протоколы WS-*, единственным способом защиты веб-службы WCF WEB HTTP является предоставление службы по протоколу HTTPS с помощью SSL. Дополнительные сведения о настройке SSL с помощью IIS 7.0 см. в статье о реализации SSL в IIS.

Устранение неполадок в модели программирования WCF WEB HTTP

Когда службы WCF WEB HTTP вызываются с помощью ChannelFactoryBase<TChannel> для создания канала, WebHttpBehavior использует адрес EndpointAddress, заданный в файле конфигурации, даже в случае, когда в EndpointAddress передается другой ChannelFactoryBase<TChannel>.

См. также