Bedingtes GET und PUTConditional Get and Put

In diesem Beispiel wird veranschaulicht, wie die neuen bedingten Abruf- und Aktualisierungs-APIs für das WCF REST-Programmiermodell verwendet werden.This sample demonstrates how to use the new conditional retrieve and update APIs for the WCF REST programming model. Da bedingtes abrufen und aktualisieren für am besten geeignet sind Ressource orientierten und REST-Dienste, die in diesem Beispiel erweitert die grundlegenden Ressourcendiensts Beispiel.Because conditional retrieve and update are most appropriate for resource-oriented and REST services, this sample extends the Basic Resource Service sample. Dieses Beispiel befasst sich das Hinzufügen der Unterstützung für bedingten Abruf- und aktualisieren Sie auf die grundlegenden Ressourcendiensts -Beispiels mit der neuen APIs in eingeführte .NET Framework Version 4.NET Framework version 4.This sample focuses on adding support for conditional retrieve and update to the Basic Resource Service sample using the new APIs introduced in .NET Framework Version 4.NET Framework version 4.

VeranschaulichtDemonstrates

Bedingtes Abrufen und AktualisierenConditional Retrieve and Update

DiskussionDiscussion

Der WCF-Dienst in diesem Beispiel macht eine Auflistung der Kunden auf ressourcenorientierte und REST-Weise verfügbar.The WCF service in this sample exposes a collection of customers in a resource-oriented and REST manner. Eine ausführliche Beschreibung der dienstimplementierung, finden Sie unter der grundlegenden Ressourcendiensts Beispiel.For a detailed description of the service implementation, please see the Basic Resource Service sample.

Dieses Beispiel fügt die bedingten Abruf- und Aktualisierungsfunktionen auf die grundlegenden Ressourcendiensts Beispiel.This sample adds conditional retrieve and update capabilities to the Basic Resource Service sample. Die bedingten Abruf- und Aktualisierungsfunktionen überprüfen mithilfe der HTTP-Entitätstags und der HTTP-Header If-None-Match und If-Match, dass Clients entweder über die aktuellste Entität für eine angegebene Ressource verfügen oder nicht.Conditional retrieve and update use HTTP entity tags and the HTTP If-None-Match and If-Match headers to validate that clients either have or do not have the most current entity for a given resource. Die Implementierung des Codes zum ordnungsgemäßen Analysieren der HTTP-Header If-None-Match und If-Match kann sich jedoch als mühsam und fehleranfällig erweisen.However, implementing the code to correctly parse the HTTP If-None-Match and If-Match headers can be tedious and error-prone. Aus diesem Grund wurden die Methoden CheckConditionalRetrieve und CheckConditionalUpdate zu IncomingWebRequestContext hinzugefügt, auf die über die aktuelle WebOperationContext-Instanz zugegriffen werden kann.Therefore, the CheckConditionalRetrieve and CheckConditionalUpdate methods have been added to the IncomingWebRequestContext, which can be accessed using the current instance of the WebOperationContext. Darüber hinaus wurde die SetETag-Methode zu OutgoingWebRequestContext hinzugefügt, sodass es einfacher ist, gültige Entitätstags zurückzugeben.In addition, the SetETag method has been added to the OutgoingWebRequestContext, making it easier to return valid entity tags.

Die CheckConditionalRetrieve-Methode ist für die Verwendung mit [WebGet]-Vorgängen bestimmt.The CheckConditionalRetrieve method is intended to be used with [WebGet] operations. Das aktuelle Entitätstag wird für die angegebene Ressource als entityTag-Parameter verwendet. Dabei kann es sich um string, int, long oder Guid handeln.It takes the current entity tag for the given resource as the entityTag parameter, which can be a string, int, long or Guid. Die CheckConditionalRetrieve-Methode vergleicht das Entitätstag mit dem HTTP-Header If-None-Match der Anforderung.The CheckConditionalRetrieve method checks the entity tag against the HTTP If-None-Match header of the request. Wenn das Entitätstag im HTTP-Header If-None-Match vorhanden ist, wird eine WebFaultException mit dem Statuscode 304 (Nicht geändert) ausgelöst; andernfalls gibt die Methode einen Wert zurück.If the entity tag is present in the HTTP If-None-Match header, then a WebFaultException with a status code of Not Modified (304) is thrown; otherwise the method returns. Der bedingte Abrufmechanismus ermöglicht es dem Client, dem Server mitzuteilen, dass er über diese Entität verfügt, und dass die aktuelle Entität nur gesendet werden soll, wenn sie der Client nicht bereits hat.The conditional retrieve mechanism allows the client to tell the server that it has this entity and to only send the current entity if the client does not already have it. Beispiele für die Nutzung der CheckConditionalRetrieve-Methode sind in den Vorgängen GetCustomer und GetCustomers des Diensts zu finden.Example usage of the CheckConditionalRetrieve method can be seen in the GetCustomer and GetCustomers operations of the service. Wichtig: Aufrufe der CheckConditionalRetrieve-Methode geben möglicherweise keinen Wert zurück.It is important to note that calls to CheckConditionalRetrieve may not return. Entwickler sollten den Vorgang so implementieren, dass die Anforderung bereits vor dem Aufruf von CheckConditionalRetrieve als erfolgreich angesehen wird, damit der Dienst eine Antwort mit erfolgreichem Statuscode senden würde, auch wenn der Aufruf von CheckConditionalRetrieve nicht vorhanden wäre.Developers should implement the operation so that the request is already known to be successful before the call to CheckConditionalRetrieve is executed, such that if the call to CheckConditionalRetrieve was not present, the service would send a response with a successful status code.

Die CheckConditionalUpdate-Methode ähnelt der CheckConditionalRetrieve-Methode.The CheckConditionalUpdate method is similar to the CheckConditionalRetrieve method. Sie verwendet auch das aktuelle Entitätstag für die angegebene Ressource.It also takes the current entity tag for the given resource. Es soll jedoch mit [WebInvoke]-Vorgängen verwendet werden, in dem die Methode auf "PUT" oder "DELETE" festgelegt ist.However, it is intended to be used with [WebInvoke] operations in which the method is set to "PUT" or "DELETE". Die CheckConditionalUpdate-Methode vergleicht das Entitätstag mit dem HTTP-Header If-Match der Anforderung.The CheckConditionalUpdate method checks the entity tag against the HTTP If-Match header of the request. Wenn das Entitätstag im HTTP-Header If-Match nicht vorhanden ist, wird eine WebFaultException mit dem Statuscode 412 (Vorbedingungsfehler) ausgelöst.If the entity tag is not present in the HTTP If-Match header, then a WebFaultException with a status code of Precondition Failed (412) is thrown. Der bedingte Aktualisierungsmechanismus ermöglicht es dem Client, dem Server mitzuteilen, dass er über diese Entität für die Ressource verfügt und dass nur er die Ressource ändern kann, vorausgesetzt dass er über die aktuelle Entität verfügt.The conditional update mechanism allows the client to tell the server that it has this entity for the resource and to only allow the client to alter the resource; if the entity it has is current. Beispiele für die Nutzung der CheckConditionalUpdate-Methode sind in den Vorgängen UpdateCustomer und DeleteCustomer des Diensts zu finden.Example usage of the CheckConditionalUpdate method can be seen in the UpdateCustomer and DeleteCustomer operations of the service. Wie bei der CheckConditionalRetrieve-Methode sollte auch hier beachtet werden, dass Aufrufe der CheckConditionalUpdate-Methode möglicherweise keinen Wert zurückgeben.Just as with CheckConditionalRetrieve, it is important to note that calls to CheckConditionalUpdate may not return. Entwickler sollten den Vorgang so implementieren, dass die Anforderung bereits vor dem Aufruf von CheckConditionalUpdate als erfolgreich angesehen wird, damit der Dienst eine Antwort mit erfolgreichem Statuscode senden würde, auch wenn der Aufruf von CheckConditionalUpdate nicht vorhanden wäre.Developers should implement the operation such that the request is already known to be successful before the call to CheckConditionalUpdate is executed, such that if the call to CheckConditionalUpdate was not present, the service would respond with a successful status code.

Das Beispiel umfasst einen selbst gehosteten Dienst und einen Client, der in einer Konsolenanwendung ausgeführt wird.The sample consists of a self-hosted service and a client that runs within a console application. Während die Konsolenanwendung ausgeführt wird, sendet der Client Anforderungen an den Dienst und schreibt die in den Antworten enthaltenen wichtigen Informationen in das Konsolenfenster.As the console application runs, the client makes requests to the service and writes the pertinent information from the responses to the console window.

So führen Sie das Beispiel ausTo run the sample

  1. Öffnen Sie die Projektmappe für das bedingte Get- und Put-Beispiel.Open the solution for the Conditional Get and Put sample. Sie müssen Visual Studio 2012Visual Studio 2012 als Administrator ausführen, damit das Beispiel erfolgreich ausgeführt werden kann.When launching Visual Studio 2012Visual Studio 2012, you must run as an administrator to execute the sample successfully. Zu diesem Zweck mit der rechten Maustaste die Visual Studio 2012Visual Studio 2012 Symbol und Auswahl als Administrator ausführen aus dem Kontextmenü.Do this by right-clicking the Visual Studio 2012Visual Studio 2012 icon and choosing Run as Administrator from the context menu.

  2. Drücken Sie STRG+UMSCHALT+B, um die Projektmappe zu erstellen, und dann STRG+F5, um das Konsolenanwendungsprojekt auszuführen.Press CTRL+SHIFT+B to build the solution and then press CTRL+F5 to run the console application project. Wenn bei der Ausführung dieses Projekts Debuggen aktiviert ist, (durch Drücken von F5 statt STRG+F5), wird der Debugger beendet, wenn durch die bedingte GET und PUT-Überprüfung eine Ausnahme ausgelöst wird.If running this project with debugging enabled (by pressing F5 instead of CTRL+F5), the debugger stops when an exception is thrown by the conditional GET and PUT checking. Drücken Sie in dem Fall F5, um mit der Ausführung des Beispiels fortzufahren.When this happens, press F5 to continue executing the sample.

  3. Im eingeblendeten Konsolenfenster werden der URI des ausgeführten Diensts und der URI der HTML-Hilfeseite für den ausgeführten Dienst angezeigt.The console window appear sand provides the URI of the running service and the URI of the HTML help page for the running service.

  4. Während das Beispiel ausgeführt wird, sendet der Client Anforderungen an den Dienst und schreibt die Antworten in das Konsolenfenster.As the sample runs, the client sends requests to the service and writes the responses to the console window.

  5. Drücken Sie eine beliebige Taste, um das Beispiel zu beenden.Press any key to terminate the sample.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Web\ConditionalGetAndPut