Практическое руководство. Выбор между запросами HTTP POST и HTTP GET для конечных точек ASP.NET AJAX

Windows Communication Foundation (WCF) позволяет создать службу, которая предоставляет конечную точку с поддержкой AJAX ASP.NET, которую можно вызывать из JavaScript на веб-сайте клиента. Основные процедуры создания таких служб рассматриваются в разделе "Практическое руководство. Использование конфигурации для добавления конечной точки AJAX ASP.NET AJAX и практическое руководство. Добавление конечной точки AJAX ASP.NET без использования конфигурации.

ASP.NET AJAX поддерживает операции, которые используют команды HTTP POST и HTTP GET (команда HTTP POST задана по умолчанию). При создании операции, не имеющей побочных эффектов и возвращающей данные, которые меняются очень редко или не меняются никогда, необходимо вместо команды по умолчанию использовать HTTP GET. Результаты операций GET можно кэшировать, чтобы представить несколько вызовов одной операции в виде одного запроса службе. Кэширование не выполняется WCF, но может выполняться на любом уровне (в браузере пользователя, на прокси-сервере и других уровнях). Кэширование выгодно, если вы хотите повысить производительность службы, но может быть неприемлемым, если данные часто изменяются или если операция выполняет некоторое действие.

Например, при создании службы для управления музыкальной библиотекой пользователя операция, осуществляющая поиск исполнителя по названию альбома, должна использовать команду GET, а операция, добавляющая альбом в личную коллекцию пользователя - команду POST.

Для управления временем существования кэша следует использовать тип OutgoingWebResponseContext. Например, при создании службы, возвращающей ежечасно обновляемые прогнозы погоды, логично использовать команду GET, ограничив длительность кэширования одним часом (или меньшим промежутком времени), чтобы пользователи службы не имели доступа к устаревшим данным.

При работе со службами со страницы ASP.NET AJAX, которые используют средство управления диспетчера скриптов, не имеет значения, использует ли операция команду GET или POST, так как механизм диспетчера скриптов обеспечивает выдачу правильного типа запроса.

Операции HTTP GET используют любые входные параметры, поддерживаемые операциями POST, включая сложные типы контрактов данных. Однако в большинстве случаев в операциях GET не рекомендуется использовать слишком много параметров или слишком сложные параметры, так как это снижает эффективность кэширования.

В этом разделе также объясняется, как выбрать между командами GET и POST, добавив в соответствующие операции в контракте службы атрибуты WebGetAttribute или WebInvokeAttribute. Другие шаги (для реализации, настройки и размещения службы), необходимые для запуска службы, аналогичны тем, которые используются любой службой AJAX ASP.NET в WCF.

Операция, помеченная атрибутом WebGetAttribute, всегда использует запрос GET. Операция, помеченная атрибутом WebInvokeAttribute или не помеченная ни одним из двух атрибутов, использует запрос POST. Атрибут WebInvokeAttribute позволяет использовать другие HTTP-команды (кроме GET и POST, например PUT и DELETE) через свойство Method. Однако эти команды не поддерживаются ASP.NET AJAX. Если планируется использовать службу со страниц ASP.NET с помощью средства управления диспетчера скриптов, применять свойство Method не следует.

Рабочий пример перехода на GET см. в примере службы BASIC AJAX.

Пример, использующий POST, см . в примере СЛУЖБЫ AJAX с помощью HTTP POST .

Создание службы WCF, отвечающей на запросы HTTP GET или HTTP POST

  1. Определите базовый контракт службы WCF с интерфейсом, помеченным атрибутом ServiceContractAttribute . Пометьте каждую операцию атрибутом OperationContractAttribute. Добавьте атрибут WebGetAttribute, чтобы указать, что операция должна отвечать на запросы HTTP GET. Также можно использовать атрибут WebInvokeAttribute, чтобы явно задать HTTP POST, либо не указывать атрибут, и в этом случае по умолчанию будет использоваться HTTP POST.

    [ServiceContract]  
    public interface IMusicService  
    {  
        //This operation uses a GET method.  
        [OperationContract]  
        [WebGet]  
        string LookUpArtist(string album);  
    
        //This operation will use a POST method.  
        [OperationContract]  
        [WebInvoke]  
        void AddAlbum(string user, string album);  
    
        //This operation will use POST method by default  
        //since nothing else is explicitly specified.  
        [OperationContract]  
        string[] GetAlbums(string user);  
    
        //Other operations omitted…  
    
    }  
    
  2. Реализуйте контракт службы IMusicService с помощью класса MusicService.

    public class MusicService : IMusicService  
    {  
        public void AddAlbum(string user, string album)  
        {  
            //Add implementation here.  
        }  
    
         //Other operations omitted…  
    }  
    
  3. Создайте в приложении новый файл с именем "service" и расширением .svc. Измените этот файл, добавив соответствующие сведения о директиве @ServiceHost для службы. Укажите, что WebScriptServiceHostFactory необходимо использовать в директиве @ServiceHost для автоматической настройки конечной точки ASP.NET AJAX.

    <%@ServiceHost
        language=c#
        Debug="true"
        Service="Microsoft.Ajax.Samples.MusicService"  
        Factory=System.ServiceModel.Activation.WebScriptServiceHostFactory  
    %>  
    

Вызов службы

  1. Протестировать операции GET службы можно без кода клиента с помощью браузера. Например, если служба настроена по http://example.com/service.svc адресу, введите http://example.com/service.svc/LookUpArtist?album=SomeAlbum в адресную строку браузера вызов службы и приводит к скачиванию или отображению ответа.

  2. Службы с операциями GET можно использовать так же, как и любые другие службы ASP.NET AJAX, т. е. введя URL-адрес службы в коллекцию скриптов средства управления диспетчера скриптов ASP.NET AJAX. Пример см. в разделе "Базовая служба AJAX".

См. также