Программирование HTTP с использованием WCF - Программирование HTTP с использованием WCF

ОГЛАВЛЕНИЕ

Программирование HTTP с использованием WCF

Используя в качестве основы эти идеи веб-технологии, рассмотрим применение WCF в среде .NET Framework 3.5 для создания приложений, в которых соблюдаются данные принципы. Начнем с изучения некоторых новых стандартных блоков модели программирования HTTP и продолжим, продвигаясь к верхнему уровню системы.

Если предполагается «использовать URI-адреса», возможно, придется освоить создание и анализ URI-адресов. Выполнение этой задачи вручную является утомительным и сопровождается возникновением ошибок. Однако новые типы System.UriTemplate и System.UriTemplateMatch берут на себя сложную работу по созданию и анализу URI-адресов и некоторых основополагающих стандартных блоков для новых функций WCF на основе HTTP.

Тип UriTemplate является основным стандартным блоком для определения «дыр» URI-адреса, обсуждавшихся ранее. Конструктор типа UriTemplate принимает строку String, представляющую «дыры» в URI-адресе. После создания экземпляра объект UriTemplate предоставляет два метода экземпляров для привязки текстовых значений к «дырам», определенным при создании экземпляра. Эти методы возвращают URI-адрес, дыры которого наполняются значениями.

Объект UriTemplate также предоставляет метод экземпляра с именем Match для извлечения значений из «дыр» объекта System.Uri. Метод экземпляра Match принимает два объекта System.Uri. Первый Uri является базовым адресом, а второй — кандидатом на совпадение. Объект System.UriTemplateMatch возвращается из метода Match. Объект UriTemplateMatch содержит коллекцию значений для «дыр», определенных при создании экземпляра UriTemplate.

Код на рис. 2 демонстрирует способ использования типов UriTemplate и UriTemplateMatch для обращения к Uri. Результатом работы этого кода являются следующие данные:

Рис. 2 Creating a Template-Based URI

// create a URI bound to the template
Uri baseAddress = new Uri(@"http://localhost:2000");
UriTemplate template = new UriTemplate("{artist}?album={album}");
Uri boundUri = template.BindByPosition(baseAddress, "Northwind", 
  "Overdone");
Console.WriteLine(boundUri.ToString());
   
// retrieve the value of the artist segment
UriTemplateMatch match = template.Match(baseAddress, boundUri);
String bandName = match.BoundVariables["artist"];
Console.WriteLine("the name of the artist is {0}", bandName);

http://localhost:2000/Northwind?album=Overdone
the name of the artist is Northwind

У типов System.UriTemplate и System.UriTemplateMatch отсутствует обычное для WCF специальное имя System.ServiceModel в пространстве имен. Это связано с тем, что их набор функций не обязательно использовать внутри приложения WCF. Они всегда под рукой, когда требуется создать или проанализировать URI-адрес.

Хотя типы UriTemplate и UriTemplateMatch очень удобны в использовании, группа разработки WCF стремилась к тому, чтобы повысить удобство использования этих двух типов в службе WCF. Цель заключалась в том, чтобы предложить простой и интуитивно понятный способ отображения сегментов URI-адреса и параметров строки запроса в функции приложений. Полагаю, что модель, приведенная в следующем коде, отвечает всем требованиям:

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

  [OperationContract]
  [WebGet(UriTemplate = "picture/t/{pictureId}")]
  Stream GetPictureThumbnail(String pictureId);

UriTemplate предстает в виде свойства экземпляра для типа WebGetAttribute, который, в свою очередь, применяется к контракту службы. Отметим, что маркер в фигурных скобках отображается на имя параметра метода. Хотя в этом примере показан только один параметр, можно добавлять много параметров, располагать их в любом порядке, добавлять параметры строки запроса и даже использовать подстановочные символы.

На этапе выполнения значение свойства UriTemplate передается конструктору UriTemplate. Как среда выполнения клиента, так и диспетчер используют значение свойства UriTemplate этим же способом. Диспетчер использует его для установления соответствия входящих сообщений и операции, а клиент использует его для обеспечения отправки по правильному URI-адресу метода с прокси. Это удобный в использовании, простой и эффективный способ «использования URI-адресов» в службах.