Como: escolher entre solicitações HTTP POST e HTTP GET para pontos de extremidade AJAX ASP.NET

O WCF (Windows Communication Foundation) permite que você crie um serviço que exponha um ponto de extremidade habilitado para ASP.NET AJAX que pode ser chamado do JavaScript em um site cliente. Os procedimentos básicos para a criação desses serviços são discutidos em Como usar uma configuração para adicionar um ponto de extremidade ASP.NET AJAX e Como adicionar um ponto de extremidade ASP.NET AJAX sem usar uma configuração.

ASP.NET AJAX dá suporte para operações que usam os verbos HTTP POST e HTTP GET, sendo HTTP POST o padrão. Ao criar uma operação que não tenha efeitos colaterais e retorna dados que raramente ou nunca são alterados, use HTTP GET. Os resultados das operações GET podem ser armazenados em cache, o que significa que várias chamadas para a mesma operação podem resultar em apenas uma solicitação para seu serviço. O cache não é feito pelo WCF, mas pode ocorrer em qualquer nível (no navegador de um usuário, em um servidor proxy e em outros níveis). O cache é vantajoso se você quiser aumentar o desempenho do serviço, mas pode não ser aceitável se os dados são alterados com frequência ou se a operação executa alguma ação.

Por exemplo, se você estiver projetando um serviço para gerenciar a biblioteca de músicas de um usuário, uma operação que pesquisa o artista com base no título de um álbum se beneficia de usar GET, mas uma operação que adiciona um álbum à coleção pessoal do usuário deve usar POST.

Para controlar o tempo de vida do cache, use o tipo OutgoingWebResponseContext. Por exemplo, ao projetar um serviço que retorna previsões meteorológicas atualizadas por hora, você usaria GET, mas limitaria a duração do cache a uma hora ou menos para impedir que os usuários do serviço acessem dados obsoletos.

Ao usar serviços de uma página ASP.NET AJAX que usam o controle do Gerenciador de Scripts, não faz diferença se a operação usa GET ou POST; o mecanismo do gerenciador de scripts garante que o tipo de solicitação correto seja emitido.

As operações HTTP GET usam todos os parâmetros de entrada compatíveis com operações POST, incluindo tipos complexos de contrato de dados. No entanto, na maioria dos casos, é recomendável evitar muitos parâmetros ou parâmetros que são muito complexos em operações GET porque isso reduz a eficiência do cache.

Este tópico demonstra como selecionar entre GET e POST adicionando os atributos WebGetAttribute ou WebInvokeAttribute às operações relevantes no contrato de serviço. As outras etapas (para implementar, configurar e hospedar o serviço) necessárias para que o serviço seja executado são semelhantes às usadas por qualquer serviço ASP.NET AJAX no WCF.

Uma operação marcada com WebGetAttribute sempre usa uma solicitação GET. Uma operação marcada com WebInvokeAttribute ou não marcada com nenhum dos dois atributos, usa uma solicitação POST. O WebInvokeAttribute permite o uso de outros verbos HTTP, além de GET e POST (como PUT e DELETE) por meio da propriedade Method. No entanto, esses verbos não têm suporte ASP.NET AJAX. Se você pretende usar o serviço das páginas do ASP.NET usando o controle gerenciador de scripts, não use a propriedade Method.

Para obter um exemplo funcional de alternância para GET, consulte o exemplo básico do Serviço AJAX.

Para obter um exemplo que usa POST, consulte o serviço AJAX usando o exemplo HTTP POST.

Para criar um serviço WCF que responde a solicitações HTTP GET ou HTTP POST

  1. Defina um contrato de serviço WCF básico com uma interface marcada com o atributo ServiceContractAttribute. Marque cada operação com o OperationContractAttribute. Adicione o atributo WebGetAttribute para estipular que uma operação deve responder às solicitações HTTP GET. Você também pode adicionar o atributo WebInvokeAttribute para especificar explicitamente HTTP POST ou não especificar um atributo, que é o padrão para 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. Implemente o contrato de serviço IMusicService com um MusicService.

    public class MusicService : IMusicService  
    {  
        public void AddAlbum(string user, string album)  
        {  
            //Add implementation here.  
        }  
    
         //Other operations omitted…  
    }  
    
  3. Crie um novo arquivo chamado serviço com uma extensão .svc no aplicativo. Edite esse arquivo adicionando as informações de diretiva de @ServiceHost apropriadas ao serviço. Especifique que WebScriptServiceHostFactory deve ser usada na diretiva @ServiceHost para configurar automaticamente um ponto de extremidade ASP.NET AJAX.

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

Para chamar o serviço

  1. Você pode testar as operações GET do serviço sem nenhum código do cliente usando o navegador. Por exemplo, se o serviço estiver configurado no endereço http://example.com/service.svc, digitar http://example.com/service.svc/LookUpArtist?album=SomeAlbum na barra de endereços do navegador invocará o serviço e fará com que a resposta seja baixada ou exibida.

  2. Você pode usar serviços com operações GET da mesma forma que qualquer outro serviço ASP.NET AJAX, inserindo a URL de serviço na coleção Scripts do controle de gerenciador de scripts do ASP.NET AJAX. Para obter um exemplo, consulte o Serviço AJAX Básico.

Confira também