Procedure: Kiezen tussen HTTP POST- en HTTP GET-aanvragen voor ASP.NET AJAX-eindpunten
Met Windows Communication Foundation (WCF) kunt u een service maken waarmee een ASP.NET AJAX-eindpunt wordt weergegeven dat kan worden aangeroepen vanuit JavaScript op een clientwebsite. De basisprocedures voor het bouwen van dergelijke services worden besproken in Procedure: Configuratie gebruiken om een ASP.NET AJAX-eindpunt toe te voegen en instructies: Een ASP.NET AJAX-eindpunt toevoegen zonder configuratie te gebruiken.
ASP.NET AJAX ondersteunt bewerkingen die gebruikmaken van de HTTP POST- en HTTP GET-woorden, waarbij HTTP POST de standaardinstelling is. Wanneer u een bewerking maakt die geen bijwerkingen heeft en gegevens retourneert die zelden of nooit worden gewijzigd, gebruikt u in plaats daarvan HTTP GET. Resultaten van GET-bewerkingen kunnen in de cache worden opgeslagen, wat betekent dat meerdere aanroepen naar dezelfde bewerking slechts één aanvraag voor uw service kunnen opleveren. De caching wordt niet uitgevoerd door WCF, maar kan plaatsvinden op elk niveau (in de browser van een gebruiker, op een proxyserver en andere niveaus.) Caching is voordelig als u de serviceprestaties wilt verbeteren, maar is mogelijk niet acceptabel als gegevens regelmatig worden gewijzigd of als de bewerking een bepaalde actie uitvoert.
Als u bijvoorbeeld een service ontwerpt voor het beheren van de muziekbibliotheek van een gebruiker, moet een bewerking die de artiest opzoekt op basis van de titel van een album, profiteren van het gebruik van GET, maar een bewerking waarmee een album wordt toegevoegd aan de persoonlijke verzameling van de gebruiker, moet POST gebruiken.
Gebruik het OutgoingWebResponseContext type om de levensduur van de cache te beheren. Wanneer u bijvoorbeeld een service ontwerpt die weersvoorspellingen per uur retourneert, gebruikt u GET, maar beperkt u de cacheduur tot een uur of minder om te voorkomen dat de gebruikers van de service toegang krijgen tot verlopen gegevens.
Wanneer u services van een ASP.NET AJAX-pagina gebruikt die gebruikmaken van het besturingselement Scriptbeheer, maakt het geen verschil of de bewerking GET of POST gebruikt. Het scriptbeheermechanisme zorgt ervoor dat het juiste aanvraagtype wordt uitgegeven.
HTTP GET-bewerkingen maken gebruik van invoerparameters die worden ondersteund door POST-bewerkingen, waaronder complexe typen gegevenscontracten. In de meeste gevallen wordt het echter aanbevolen om te veel parameters of parameters te vermijden die te complex zijn in GET-bewerkingen, omdat dit de efficiëntie van caching vermindert.
In dit onderwerp wordt gedemonstreerd hoe u kunt kiezen tussen GET en POST door de WebGetAttribute of WebInvokeAttribute kenmerken toe te voegen aan de relevante bewerkingen in het servicecontract. De andere stappen (voor het implementeren, configureren en hosten van de service) die nodig zijn om de service uit te voeren, zijn vergelijkbaar met de stappen die worden gebruikt door elke ASP.NET AJAX-service in WCF.
Een bewerking die is gemarkeerd met de WebGetAttribute functie gebruikt altijd een GET-aanvraag. Een bewerking die is gemarkeerd met de WebInvokeAttribute, of niet gemarkeerd met een van de twee kenmerken, maakt gebruik van een POST-aanvraag. Hiermee WebInvokeAttribute kunt u andere HTTP-woorden gebruiken, behalve GET en POST (zoals PUT en DELETE) via de Method eigenschap. Deze werkwoorden worden echter niet ondersteund door ASP.NET AJAX. Als u de service wilt gebruiken vanaf ASP.NET pagina's met behulp van het besturingselement Scriptbeheer, gebruikt u de Method eigenschap niet.
Zie het voorbeeld van de Basic AJAX-service voor een werkend voorbeeld van het overschakelen naar GET.
Zie de AJAX-service met HTTP POST-voorbeeld voor een voorbeeld dat GEBRUIKMAAKT van POST.
Een WCF-service maken die reageert op HTTP GET- of HTTP POST-aanvragen
Definieer een eenvoudig WCF-servicecontract met een interface die is gemarkeerd met het ServiceContractAttribute kenmerk. Markeer elke bewerking met de OperationContractAttribute. Voeg het WebGetAttribute kenmerk toe om te bepalen dat een bewerking moet reageren op HTTP GET-aanvragen. U kunt het WebInvokeAttribute kenmerk ook toevoegen om HTTP POST expliciet op te geven of geen kenmerk op te geven, wat standaard wordt gebruikt voor 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… }
Implementeer het
IMusicService
servicecontract met eenMusicService
.public class MusicService : IMusicService { public void AddAlbum(string user, string album) { //Add implementation here. } //Other operations omitted… }
Maak een nieuw bestand met de naam service met de extensie .svc in de toepassing. Bewerk dit bestand door de juiste @ServiceHost instructiegegevens voor de service toe te voegen. Geef op dat het WebScriptServiceHostFactory moet worden gebruikt in de @ServiceHost instructie om automatisch een ASP.NET AJAX-eindpunt te configureren.
<%@ServiceHost language=c# Debug="true" Service="Microsoft.Ajax.Samples.MusicService" Factory=System.ServiceModel.Activation.WebScriptServiceHostFactory %>
De service aanroepen
U kunt de GET-bewerkingen van uw service testen zonder clientcode, met behulp van de browser. Als uw service bijvoorbeeld is geconfigureerd op het
http://example.com/service.svc
adres, roept uhttp://example.com/service.svc/LookUpArtist?album=SomeAlbum
in de adresbalk van de browser de service aan en wordt het antwoord gedownload of weergegeven.U kunt services met GET-bewerkingen op dezelfde manier gebruiken als andere ASP.NET AJAX-services: door de service-URL in te voeren in de verzameling Scripts van het besturingselement ASP.NET AJAX Script Manager. Zie de Basic AJAX-service voor een voorbeeld.