Partilhar via


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

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

ASP.NET AJAX suporta operações que usam os verbos HTTP POST e HTTP GET, com HTTP POST sendo o padrão. Ao criar uma operação que não tem efeitos colaterais e retorna dados que raramente ou nunca mudam, use HTTP GET em vez disso. 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 ao 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 forem alterados com frequência ou se a operação executar alguma ação.

Por exemplo, se você estiver criando um serviço para gerenciar a biblioteca de música de um usuário, uma operação que procura o artista com base no título de um álbum se beneficia do uso do 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 OutgoingWebResponseContext tipo. Por exemplo, ao projetar um serviço que retorna previsões meteorológicas atualizadas de hora em 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 acessassem dados obsoletos.

Ao usar serviços de uma página AJAX ASP.NET que usam o controle 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 quaisquer parâmetros de entrada suportados por operações POST, incluindo tipos de contrato de dados complexos. No entanto, na maioria dos casos, recomenda-se evitar muitos parâmetros ou parâmetros que são muito complexos em operações GET porque reduz a eficiência do cache.

Este tópico demonstra como selecionar entre GET e POST adicionando os WebGetAttribute atributos 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 executar o serviço são semelhantes às usadas por qualquer serviço AJAX ASP.NET no WCF.

Uma operação marcada com o WebGetAttribute sempre usa uma solicitação GET. Uma operação marcada com o WebInvokeAttribute, ou não marcada com qualquer um 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) através da Method propriedade. No entanto, estes verbos não são suportados pelo ASP.NET AJAX. Se você pretende usar o serviço de ASP.NET páginas usando o controle Gerenciador de Scripts, não use a Method propriedade.

Para obter um exemplo prático de mudança para GET, consulte o Exemplo de serviço AJAX básico.

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

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

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

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

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

Para ligar para o serviço

  1. Você pode testar as operações GET do seu serviço sem qualquer código de cliente, usando o navegador. Por exemplo, se o http://example.com/service.svc serviço estiver configurado no endereço, 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 ASP.NET serviços AJAX - inserindo a URL do serviço na coleção Scripts do controle ASP.NET AJAX Script Manager. Para obter um exemplo, consulte o Serviço AJAX Básico.

Consulte também