Condividi tramite


Procedura: scegliere tra richieste HTTP POST e HTTP GET per gli endpoint ASP.NET AJAX

WCF (Windows Communication Foundation) consente di creare un servizio che espone un endpoint ASP.NET compatibile con AJAX che può essere chiamato da JavaScript su un sito Web client. Le procedure di base per la compilazione di tali servizi sono descritte in Procedura: Usare la configurazione per aggiungere un endpoint ASP.NET AJAX e Procedura: Aggiungere un endpoint AJAX ASP.NET senza usare la configurazione.

ASP.NET AJAX supporta operazioni che usano verbi HTTP POST e HTTP GET, con HTTP POST come impostazione predefinita. Quando si crea un'operazione che non ha effetti collaterali e restituisce dati che non vengono mai modificati o vengono modificati solo di rado, usare HTTP GET. I risultati delle operazioni GET possono essere memorizzati nella cache, il che significa che più chiamate alla stessa operazione possono produrre una sola richiesta al servizio. La memorizzazione nella cache non viene eseguita da WCF ma può verificarsi a qualsiasi livello, ad esempio nel browser di un utente o in un server proxy. La memorizzazione nella cache è vantaggiosa se si desidera migliorare le prestazioni del servizio, ma potrebbe non essere accettabile se i dati vengono modificati di frequente o se l'operazione esegue azioni.

Ad esempio, se si sta progettando un servizio per gestire il catalogo musicale di un utente, un'operazione che ricerca l'artista in base al titolo di un album trae vantaggio dall'utilizzo di GET, ma un'operazione che aggiunge un album alla raccolta personale dell'utente deve usare POST.

Per controllare la durata della cache, usare il tipo OutgoingWebResponseContext. Ad esempio, quando si progetta un servizio che restituisce previsioni meteorologiche aggiornate ogni ora, si utilizzerà GET limitando però la durata della cache a massimo un'ora, per impedire agli utenti del servizio di accedere a dati non aggiornati.

Quando si usano servizi da una pagina ASP.NET AJAX che usano il controllo Script Manager, non c'è alcuna differenza se l'operazione usa GET o POST, il meccanismo di gestione degli script assicura che venga emesso il tipo di richiesta corretto.

Le operazioni HTTP GET usano qualsiasi parametro di input supportato dalle operazioni POST, inclusi i tipi di contratto dati complessi. Tuttavia, nella maggior parte dei casi è consigliabile evitare di usare troppi parametri o parametri troppo complessi nelle operazioni GET, per non ridurre l'efficienza della memorizzazione nella cache.

In questo argomento viene illustrato come scegliere tra GET e POST aggiungendo gli attributi WebGetAttribute o WebInvokeAttribute alle operazioni pertinenti nel contratto di servizio. Gli altri passaggi (per implementare, configurare e ospitare il servizio), necessari per rendere operativo il servizio sono simili a quelli usati da qualsiasi servizio ASP.NET AJAX in WCF.

Un'operazione contrassegnata da WebGetAttribute usa sempre una richiesta GET. Un'operazione contrassegnata da WebInvokeAttribute o non contrassegnata da nessuno dei due attributi, usa una richiesta POST. WebInvokeAttribute consente di usare altri verbi HTTP, diversi da GET e POST, quali PUT e DELETE, tramite la proprietà Method. Tuttavia, questi verbi non sono supportati da ASP.NET AJAX. Se si intende usare il servizio da pagine ASP.NET che usano il controllo Script Manager, non usare la proprietà Method.

Per un esempio funzionante di passaggio a GET, vedere l'esempio di servizio AJAX di base.

Per un esempio che usa POST, vedere l'esempio di servizio AJAX tramite HTTP POST.

Per creare un servizio WCF che risponde a richieste HTTP GET o HTTP POST

  1. Definire un contratto di servizio WCF di base con un'interfaccia contrassegnata con l'attributo ServiceContractAttribute. Contrassegnare ogni operazione con OperationContractAttribute. Aggiungere l'attributo WebGetAttribute per stabilire che un'operazione deve rispondere a richieste HTTP GET. È inoltre possibile aggiungere l'attributo WebInvokeAttribute per specificare esplicitamente HTTP POST o non specificare alcun attributo e scegliere quindi HTTP POST per impostazione predefinita.

    [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. Implementare il contratto di servizio IMusicService con MusicService.

    public class MusicService : IMusicService  
    {  
        public void AddAlbum(string user, string album)  
        {  
            //Add implementation here.  
        }  
    
         //Other operations omitted…  
    }  
    
  3. Creare un nuovo file denominato "file del servizio" con estensione svc nell'applicazione. Modificare questo file aggiungendo le informazioni della direttiva @ServiceHost appropriate per il servizio. Specificare che è necessario usare WebScriptServiceHostFactory nella direttiva @ServiceHost per configurare automaticamente un endpoint ASP.NET AJAX.

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

Per chiamare il servizio

  1. È possibile testare le operazioni GET del servizio senza alcun codice client, usando il browser. Ad esempio, se il servizio è configurato nell'indirizzo http://example.com/service.svc, digitare http://example.com/service.svc/LookUpArtist?album=SomeAlbum nella barra degli indirizzi del browser richiama il servizio e fa sì che la risposta venga scaricata o visualizzata.

  2. È possibile usare servizi con operazioni GET esattamente come qualsiasi altro servizio ASP.NET AJAX, immettendo l'URL del servizio nella raccolta degli script del controllo Script Manager ASP.NET AJAX. Per un esempio, vedere il servizio AJAX di base.

Vedi anche