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


Условные методы Get и Put

В этом образце демонстрируется использование новых интерфейсов API условного получения и обновления для модели программирования WCF REST. Поскольку условное получение и обновление больше всего подходит для служб REST и служб, ориентированных на ресурсы, этот образец расширяет образец Основная служба ресурсов. Основное внимание в этом образце уделяется добавлению к образцу Основная служба ресурсов поддержки условного получения и обновления с помощью новых API, появившихся в .NET Framework, версия 4.

Демонстрации

Условное получение и обновление

Обсуждение

В этом образце служба WCF предоставляет доступ к коллекции клиентов в стиле REST и с ориентацией на ресурсы. Подробное описание реализации службы см. в образце Основная служба ресурсов.

Этот образец добавляет возможности условного получения и обновления к образцу Основная служба ресурсов. Для проверки наличия у клиента последней сущности для данного ресурса при условном получении и обновлении используются теги сущности HTTP и заголовки HTTP If-None-Match и If-Match. Однако реализация кода для правильной проверки заголовков HTTP If-None-Match и If-Match занимает много времени и редко получается без ошибок. В связи с этим в контекст IncomingWebRequestContext были добавлены методы CheckConditionalRetrieve и CheckConditionalUpdate, доступ к которым можно получить с помощью текущего экземпляра контекста WebOperationContext. Кроме того, в контекст OutgoingWebRequestContext был добавлен метод SetETag, что упрощает возврат допустимых тегов сущностей.

Метод CheckConditionalRetrieve предназначен для использования с операциями [WebGet]. Он принимает тег текущей сущности данного ресурса в качестве параметра entityTag, который может иметь тип string, int, long или Guid. Метод CheckConditionalRetrieve проверяет тег сущности по заголовку HTTP If-None-Match запроса. Если этот тег сущности имеется в заголовке HTTP If-None-Match, то формируется исключение WebFaultException с кодом состояния «Не изменено» (304). В противном случае метод возвращает значение. Этот механизм условного получения позволяет клиенту сообщать серверу, что у него есть эта сущность, и отправлять текущую сущность, только если ее у клиента нет. Пример использования метода CheckConditionalRetrieve можно посмотреть в операциях GetCustomer и GetCustomers службы. Важно отметить, что при вызове метода CheckConditionalRetrieve значение может быть не возвращено. Разработчикам следует реализовывать операцию так, чтобы до вызова метода CheckConditionalRetrieve уже было известно, что запрос выполнен успешно, с тем чтобы при отсутствии вызова метода CheckConditionalRetrieve служба отправляла сообщение с кодом состояния успешного выполнения.

Метод CheckConditionalUpdate похож на метод CheckConditionalRetrieve. Он тоже принимает тег текущей сущности для данного ресурса. Однако он предназначен для использования с операциями [WebInvoke], в которых для метода задается значение «PUT» или «DELETE». Метод CheckConditionalUpdate проверяет тег сущности по заголовку HTTP If-Match запроса. Если в заголовке HTTP If-Match тег сущности отсутствует, то формируется исключение WebFaultException с кодом состояния «Предварительное условие не выполнено» (412). Этот механизм условного обновления позволяет клиенту сообщать серверу, что у него есть эта сущность для ресурса; он позволяет клиенту изменять ресурс, только если имеющаяся у него сущность является текущей. Пример использования метода CheckConditionalUpdate можно посмотреть в операциях UpdateCustomer и DeleteCustomer службы. Как и в случае с методом CheckConditionalRetrieve, важно отметить, что при вызове метода CheckConditionalUpdate значение может быть не возвращено. Разработчикам следует реализовывать операцию так, чтобы до вызова метода CheckConditionalUpdate уже было известно, что запрос выполнен успешно, с тем чтобы при отсутствии вызова метода CheckConditionalUpdate служба отправляла сообщение с кодом состояния успешного выполнения.

Образец состоит из резидентной службы и клиента, который работает в консольном приложении. Во время выполнения консольного приложения клиент совершает запросы к службе и выводит в окно консоли нужные сведения из ответов.

Выполнение образца

  1. Откройте решение для образца Conditional Get and Put. Для успешного выполнения образца среду Visual Studio 2010 необходимо запускать от имени администратора. Для этого щелкните правой кнопкой мыши значок Visual Studio 2010 и выберите в контекстном меню команду Запуск от имени администратора.

  2. Нажмите кнопку F6, чтобы создать решение, а затем нажмите сочетание клавиш CTRL+F5, чтобы запустить проект консольного приложения. Если запустить этот проект с включенной функцией отладки (нажав клавишу F5 вместо CTRL+F5), то отладчик будет останавливаться, когда условная проверка GET и PUT формирует исключение. В этом случае нажмите клавишу F5, чтобы продолжить выполнение образца.

  3. Открывается окно консоли с URI запущенной службы и URI HTML-страницы справки для запущенной службы.

  4. Во время выполнения образца клиент отправляет запросы к службе и выводит ответы в окно консоли.

  5. Чтобы завершить образец, нажмите любую клавишу.

Ee818665.Important(ru-ru,VS.100).gif Примечание
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).

<диск_установки>:\WF_WCF_Samples

Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.

<диск_установки>:\WF_WCF_Samples\WCF\Basic\Web\ConditionalGetAndPut