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

Windows Communication Foundation (WCF) consente di creare un servizio che espone un endpoint abilitato ASP.NET AJAX che può essere chiamato da JavaScript in 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 AJAX ASP.NET e Procedura: Aggiungere un endpoint AJAX ASP.NET senza usare la configurazione.

ASP.NET AJAX supporta operazioni che usano i 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 raramente o mai cambiano, usare INvece HTTP GET. I risultati delle operazioni GET possono essere memorizzati nella cache, il che significa che più chiamate alla stessa operazione possono comportare una sola richiesta al servizio. La memorizzazione nella cache non viene eseguita da WCF, ma può essere eseguita a qualsiasi livello (nel browser di un utente, in un server proxy e in altri livelli). La memorizzazione nella cache è vantaggiosa se si desidera migliorare le prestazioni del servizio, ma potrebbe non essere accettabile se i dati cambiano frequentemente o se l'operazione esegue un'azione.

Ad esempio, se stai progettando un servizio per gestire la libreria musicale di un utente, un'operazione che cerca l'artista in base al titolo di un album beneficia dell'uso 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 OutgoingWebResponseContext tipo . Ad esempio, quando si progetta un servizio che restituisce previsioni meteo aggiornate ogni ora, si usa GET, ma si limita la durata della cache a un'ora o meno per impedire agli utenti del servizio di accedere ai dati non aggiornati.

Quando si usano i servizi da una pagina ASP.NET AJAX che usa il controllo Gestione script, non fa differenza se l'operazione usa GET o POST. Il meccanismo di gestione script garantisce che venga eseguito 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. Nella maggior parte dei casi, tuttavia, è consigliabile evitare troppi parametri o parametri troppo complessi nelle operazioni GET perché riduce l'efficienza della memorizzazione nella cache.

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

Un'operazione contrassegnata con WebGetAttribute usa sempre una richiesta GET. Un'operazione contrassegnata con , WebInvokeAttributeo non contrassegnata con uno dei due attributi, usa una richiesta POST. WebInvokeAttribute consente l'uso di altri verbi HTTP, diversi da GET e POST (ad esempio PUT e DELETE) tramite la Method proprietà . Tuttavia, questi verbi non sono supportati da ASP.NET AJAX. Se si intende utilizzare il servizio dalle pagine ASP.NET usando il controllo Script Manager, non utilizzare 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 AJAX Service Using HTTP POST (Servizio AJAX tramite HTTP POST ).

Per creare un servizio WCF che risponde alle 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 alle richieste HTTP GET. È anche possibile aggiungere l'attributo WebInvokeAttribute per specificare in modo esplicito HTTP POST o non specificare un attributo, che per impostazione predefinita è 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. Implementare il contratto di servizio IMusicService con un MusicService.

    public class MusicService : IMusicService
    {
        public void AddAlbum(string user, string album)
        {
            //Add implementation here.
        }
    
         //Other operations omitted…
    }
    
  3. Creare un nuovo file denominato service con estensione svc nell'applicazione. Modificare questo file aggiungendo le informazioni appropriate sulla direttiva @ServiceHost per il servizio. Specificare che WebScriptServiceHostFactory deve essere usato 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 codice client usando il browser. Ad esempio, se il servizio è configurato all'indirizzo http://example.com/service.svc , digitando http://example.com/service.svc/LookUpArtist?album=SomeAlbum nella barra degli indirizzi del browser viene richiamato il servizio e la risposta viene scaricata o visualizzata.

  2. È possibile usare i servizi con operazioni GET nello stesso modo di qualsiasi altro ASP.NET servizi AJAX, immettendo l'URL del servizio nella raccolta Scripts del controllo gestione script AJAX ASP.NET. Per un esempio, vedere Il servizio AJAX di base.

Vedere anche