Программирование HTTP с использованием WCF - Глаголы HTTP в контрактах WCF

ОГЛАВЛЕНИЕ

Глаголы HTTP в контрактах WCF

Программирование HTTP с использованием WCF в среде .NET Framework 3.5 облегчает отображение операций в контракте службы на глаголы HTTP. Возможно, глядя на имя WebGetAttribute, вы догадываетесь, что применение WebGetAttribute к операции обеспечивает доступ к этой операции посредством HTTP GET. Как видно из предыдущего фрагмента кода, WebGetAttribute определяет свойство экземпляра с именем UriTemplate.

Существуют другие свойства экземпляра для типа WebGetAttribute. Наиболее существенными являются RequestFormat и ResponseFormat. Как видно из их имен, значения этих свойств задают формат сообщения для операции. Свойства RequestFormat и ResponseFormat имеют тип WebMessageFormat — перечислимый тип, имеющий два значения: Xml и Json. В инфраструктуре WCF эти значения используются для настройки стека канала с помощью соответствующего кодировщика сообщений. Значение свойства WebMessageFormat.Xml дает стек канала, использующий кодировщик XML. Установка значения WebMessageFormat.Json приводит к стеку канала, использующему кодировщик JSON, входящий в .NET Framework 3.5. Поскольку существуют свойства для обеих сторон обмена сообщениями HTTP, приложение может принимать сообщение XML, а возвращать сообщение JSON (или наоборот).

Еще одним атрибутом, связанным с глаголами HTTP, является атрибут WebInvokeAttribute. Применение этого атрибута к операции обеспечивает доступ к ней посредством любого глагола HTTP, отличного от глагола HTTP GET. Отделение глагола HTTP GET в модели объекта от других глаголов отражает частоту использования HTTP GET по сравнению с другими глаголами HTTP. Модель объекта WebInvokeAttribute подобна WebGetAttribute, но в нее входит свойство экземпляра, названное Method. Значение этого свойства сопоставляет операции конкретный глагол HTTP. Свойство Method имеет тип String, поэтому в качестве значения можно задавать любой стандартный глагол HTTP и даже нестандартные глаголы HTTP. На рис. 3 показано, как использовать WebInvokeAttribute в контракте службы.

Рис. 3 Using WebInvokeAttribute

[ServiceContract]
public interface IPictureService
{
  [OperationContract]
  [WebGet(UriTemplate = "picture/{pictureId}")]
  Stream GetPicture(String pictureId);

  [OperationContract]
  [WebGet(UriTemplate = "picture/t/{pictureId}")]
  Stream GetPictureThumbnail(String pictureId);
  
  [OperationContract]
  [WebInvoke(UriTemplate="update", Method="POST")]
  void UpdatePictureInfo(PictureInfo info);
}

У метода UpdatePictureInfo имеется параметр с типом PictureInfo. На этапе выполнения сериализованная версия объекта PictureInfo является полезной нагрузкой сообщения HTTP POST. Передача данных этим способом дает приложениям возможность доставлять сложные типы данных, для которых нет другого способа представления в URI.
WCF в среде .NET Framework 3.5 облегчает также взаимодействие с заголовками HTTP. Заголовки запросов и откликов HTTP представляются посредством типа System.ServiceModel.Web.WebOperationContext. Тип WebOperationContext является расширением типа System.ServiceModel.OperationContext, появившегося в WCF в среде .NET Framework 3.0, и используется по аналогичной схеме. Оба они предназначены для использования в реализациях объекта службы. Тип WebOperationContext предоставляет члены, упрощающие чтение или установку значений заголовков HTTP, а также извлечение информации об URI-адресе, используемом для доступа к объекту службы. Заголовки HTTP хранятся в виде коллекции, и наиболее распространенные предоставляются в виде отдельных свойств. В данном примере показан способ использования типа WebOperationContext с целью следования модели Интернета посредством установки заголовка Content-Type для ответа HTTP:

public Stream GetPicture(string pictureId)
{
  // retrieve the Stream (omitted)
  Stream stream;

  // set the Content-Type to image/jpeg
  WebOperationContext.Current.OutgoingResponse.ContentType = 
  "image/jpeg";

  return stream;
}