Vorgehensweise: Auswählen zwischen HTTP POST- und HTTP GET-Anforderungen für ASP.NET AJAX-Endpunkte
Mit Windows Communication Foundation (WCF) können Sie einen Dienst erstellen, der einen für ASP.NET AJAX aktivierten Endpunkt verfügbar macht, der auf einer Client-Website aus JavaScript aufgerufen werden kann. Die grundlegenden Verfahren zum Erstellen solcher Dienste werden unter Vorgehensweise: Verwenden der Konfiguration zum Hinzufügen eines ASP.NET AJAX-Endpunkts und Vorgehensweise: Hinzufügen eines ASP.NET AJAX-Endpunkts ohne Verwendung einer Konfiguration erläutert.
ASP.NET AJAX unterstützt Vorgänge, die HTTP POST- und HTTP GET-Verben verwenden, wobei HTTP POST der Standard ist. Wenn Sie einen Vorgang erstellen, der keine Nebeneffekte hat und Daten zurückgibt, die sich selten oder niemals ändern, können Sie stattdessen HTTP GET verwenden. Die Ergebnisse von GET-Vorgängen können zwischengespeichert werden, was bedeutet, dass mehrere Aufrufe des gleichen Vorgangs zu nur einer Anforderung an den Dienst zusammengefasst werden können. Die Zwischenspeicherung erfolgt nicht durch WCF, kann aber auf jeder Ebene (im Browser eines Benutzers, auf einem Proxyserver und auf anderen Ebenen) erfolgen. Das Zwischenspeichern ist vorteilhaft, wenn Sie die Dienstleistung erhöhen möchten, aber möglicherweise nicht akzeptabel, wenn sich Daten häufig ändern oder der Vorgang eine Aktion ausführt.
Wenn Sie beispielsweise einen Dienst für die Verwaltung der Musikbibliothek eines Benutzers entwickeln, ist es für einen Vorgang, der auf der Basis des Albumtitels den Künstler ermittelt, sinnvoll, GET zu verwenden. Ein Vorgang jedoch, der ein Album in die Sammlung des Benutzers einfügt, muss POST verwenden.
Verwenden Sie zur Steuerung der Lebensdauer des Zwischenspeichers den OutgoingWebResponseContext-Typ. Wenn Sie beispielsweise einen Dienst entwickeln, der stündlich aktualisierte Wettervorhersagen zurückgibt, könnten Sie GET verwenden, jedoch die Lebensdauer des Zwischenspeichers auf eine Stunde oder weniger beschränken, damit die Benutzer des Diensts keine veralteten Daten erhalten.
Wenn Sie auf Dienste von einer ASP.NET AJAX-Seite zugreifen, die das Skript-Manager-Steuerelement verwendet, ist es gleichgültig, ob der Vorgang GET oder POST verwendet – der Skript-Manager stellt sicher, dass der korrekte Anforderungstyp ausgegeben wird.
HTTP GET-Vorgänge verwenden alle von POST-Vorgängen unterstützten Eingabeparameter, einschließlich komplexer Datenvertragstypen. In den meisten Fällen ist es jedoch empfehlenswert, zu viele oder zu komplexe Parameter in GET-Vorgängen zu vermeiden, da sie die Effizienz der Zwischenspeicherung vermindern.
In diesem Thema wird gezeigt, wie zwischen GET und POST ausgewählt wird, indem den relevanten Vorgängen das WebGetAttribute- oder das WebInvokeAttribute-Attribut im Dienstvertrag hinzugefügt wird. Die anderen zur Ausführung eines Diensts erforderlichen Schritte (Implementieren, Konfigurieren und Hosten des Diensts) sind den Schritten ähnlich, die von jedem ASP.NET AJAX-Dienst in WCF ausgeführt werden.
Ein mit dem WebGetAttribute markierter Vorgang verwendet immer eine GET-Anforderung. Ein mit dem WebInvokeAttribute oder mit keinem der beiden Attribute markierter Vorgang verwendet eine POST-Anforderung. Das WebInvokeAttribute erlaubt über die Method-Eigenschaft die Verwendung anderer HTTP-Verben als GET und POST (etwa PUT und DELETE). Diese Verben werden jedoch von ASP.NET AJAX nicht unterstützt. Verwenden Sie die Method-Eigenschaft nicht, wenn Sie vorhaben, den Dienst von ASP.NET-Seiten aus aufzurufen, die das Skript-Manager-Steuerelement verwenden.
Ein funktionierendes Beispiel für den Wechsel zu GET finden Sie im Beispiel Einfacher AJAX-Dienst.
Ein Beispiel, in dem POST verwendet wird, finden Sie im Beispiel AJAX-Dienst mit HTTP POST.
So erstellen Sie einen WCF-Dienst, der auf HTTP GET- oder HTTP POST-Anforderungen reagiert
Definieren Sie einen WCF-Basisdienstvertrag mit einer Schnittstelle, die mit dem Attribut ServiceContractAttribute gekennzeichnet ist. Markieren Sie jeden Vorgang mit OperationContractAttribute. Fügen Sie das WebGetAttribute-Attribut hinzu, um festzulegen, dass ein Vorgang auf HTTP GET-Anforderungen reagieren sollte. Sie können auch das WebInvokeAttribute-Attribut hinzufügen, um explizit die Auswahl von HTTP POST festzulegen, oder Sie geben überhaupt kein Attribut an, wodurch standardmäßig HTTP POST verwendet wird.
[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… }
Implementieren Sie den
IMusicService
-Dienstvertrag mitMusicService
.public class MusicService : IMusicService { public void AddAlbum(string user, string album) { //Add implementation here. } //Other operations omitted… }
Erstellen Sie eine neue Datei mit einer SVC-Erweiterung in der Anwendung. Bearbeiten Sie diese Datei, indem Sie die entsprechenden @ServiceHost-Anweisungsinformationen für den Dienst hinzufügen. Geben Sie an, dass in der @ServiceHost-Anweisung WebScriptServiceHostFactory verwendet werden soll, um einen ASP.NET AJAX-Endpunkt automatisch zu konfigurieren.
<%@ServiceHost language=c# Debug="true" Service="Microsoft.Ajax.Samples.MusicService" Factory=System.ServiceModel.Activation.WebScriptServiceHostFactory %>
So rufen Sie den Dienst auf
Sie können die GET-Vorgänge Ihres Diensts ohne irgendeinen Clientcode testen, indem Sie den Browser verwenden. Wenn Ihr Dienst beispielsweise unter der Adresse
http://example.com/service.svc
konfiguriert wurde, ruft die Eingabe vonhttp://example.com/service.svc/LookUpArtist?album=SomeAlbum
in die Adressleiste des Browsers den Dienst auf und bewirkt, dass die Antwort heruntergeladen oder angezeigt wird.Sie können Dienste mit GET-Vorgängen auf gleiche Weise wie jeden anderen ASP.NET AJAX-Dienst verwenden – indem Sie die Dienst-URL in die Scripts-Auflistung des ASP.NET AJAX Script Manager-Steuerelements eingeben. Ein Beispiel dazu finden Sie unter Einfacher AJAX-Dienst.