RSS FeedFeed TwitterTwitter XINGXING
  
Meine Bücher

Verteilte Systeme und Services mit .NET 4.0: Konzepte und Lösungen mit WCF 4.0,
Hanser Fachbuchverlag

Weitere Infos

 

.NET 4 Update,
Microsoft Press

Weitere Infos

 
Weitere Bücher
Meine Artikel

Leichtgewichtige Kommunikation: REST-basierte Services mit dem neuen API aus der ASP.NET-Familie,
windows.developer

Weitere Infos

 

EAI und EDI in der Cloud ,
windows.developer

Weitere Infos

 

Verteilt und doch ein Ganzes: Verteilte Systeme mit AppFabric Applications,
dot.net magazin

Weitere Infos

 

Vorschau auf Neuerungen der kommenden WCF-Version,
dot.net magazin

Weitere Infos

 

Windows Azure Tutorial, Teil 3: Verbindung zwischen Cloud- und lokalen Applikationen,
iX - Magazin für professionelle Informationstechnik

Weitere Infos

 

MVC, die dritte: ASP.NET MVC 3 RC 2,
dot.net magazin

Weitere Infos

 

Leichtgewichtiges O/R-Mapping - Code Only mit Entitiy Framework CTP 5,
dot.net magazin

Weitere Infos

 

Weitere Artikel

Training & Beratung

Gemeinsam mit meinen Kollegen aus dem IT-Visions Netzwerk unterstützte ich durch zielgerichtete Inhouse-Schulungen und Beratung Unternehmen bei der Planung und Umsetzung von großer Software-Systeme.

Mehr lesen

In Kontakt treten

 
Konferenzen

BASTA! on Tour von 4/25/2012 bis 4/27/2012 in Düsseldorf

Meine Talks

Web-Site der Konferenz

 

BASTA! Spring 2012 von 2/27/2012 bis 3/2/2012 in Darmstadt

Meine Talks

Web-Site der Konferenz

 

ADC - Advanced Developers Conference von 10/26/2011 bis 10/27/2011 in Frankental (Deutschland)

Meine Talks

Web-Site der Konferenz

 

Scandev on tour von 10/18/2011 bis 10/18/2011 in Stockholm (Schweden)

Meine Talks

Web-Site der Konferenz

 

BASTA 2011 von 9/26/2011 bis 9/30/2011 in Mainz

Meine Talks

Web-Site der Konferenz

 

Jazoon - International Conference on the modern art of software von 6/21/2011 bis 6/23/2011 in Zürich

Meine Talks

Web-Site der Konferenz

 

Scandinavian Developer Conference 2011 von 4/4/2011 bis 4/5/2011 in Göteborg (Schweden)

Meine Talks

Web-Site der Konferenz

 

SOA-Days von 3/30/2011 bis 3/31/2011 in Bonn

Meine Talks

Web-Site der Konferenz

 
Weitere Konferenzen
von Manfred, 28. July 2010 17:54

Mit Conditional GET wird ein durch das HTTP-Protokoll unterstützter Mechanismus bezeichnet, der es Clients erlaubt, Dokumente lediglich unter der Bedingung, dass sie sich seit dem letzten Aufruf geändert haben, anzufordern. Hat sich das Dokument nicht geändert, antwortet der Server mit dem Statuscode 304 (Not Modified). Ansonsten wird das geänderte Dokument zurückgeliefert.

Um entscheiden zu können, ob sich ein Dokument geändert hat, sendet der Server mit den einzelnen Antworten einen sogenannten Entity Tag (ETag). Dieser beinhaltet einen Wert, welcher die aktuelle Version repräsentiert. Dabei kann es sich zum Beispiel um eine Versionsnummer, einen Zeitstempel oder einen Hashwert handeln. Bei weiteren Anfragen, welche sich auf dasselbe Dokument beziehen, sendet der Client diesen Wert an den Server zurück. Durch einen Vergleich mit dem aktuellen ETag kann dieser somit entscheiden, ob der Client bereits die aktuelle Version hat oder ob sich das Dokument seit dem letzten Abrufen geändert hat.

Ein Beispiel für die serverseitige Implementierung von Conditional-Get findet sich im nachfolgenden Listing. Nachdem der angeforderte Flug geladen wurde, wird dessen ETag, welcher im betrachteten Listing der Eigenschaft Version entspricht, ermittelt. Mit der Methode CheckConditionalRetrieve wird anschließend geprüft, ob dieser ETag dem eventuell vom Client mitgesendeten ETag entspricht. Falls dem so ist, löst diese Methode eine WebFaultException mit dem Http-Statuscode 304 (Not Modified) aus. Ansonsten wird der aktuelle ETag mit der Methode SetETag definiert. Somit wird festgelegt, dass dieser im Zuge der Antwortnachricht zum Client gesendet werden soll. Danach wird der gewünschte Flug zurückgeliefert.

public Flug FindFlight(string flugNummer)
{
    Flug flug = […] // Flug laden
    string etag = flug.Version.ToString();
    WebOperationContext.Current.IncomingRequest.CheckConditionalRetrieve(etag);
    WebOperationContext.Current.OutgoingResponse.SetETag(etag);
    return flug;
}

________________________________________

 

Dieser Eintrag ist ein Auszug aus meinem aktuellen Buch .Net 4 Update , das ich zusammen mit Holger Schwichtenberg verfasst habe.
________________________________________


Das nächste Listing zeigt eine zur gerade betrachteten serverseitigen Implementierung passende Implementierung eines Clients. Im Feld lastETag wird der ETag des letzten Abrufs festgehalten. Die gewünschte Resource wird unter Verwendung von WebRequest und WebResponse abgerufen. Über den Header-Eintrag If-None-Match wird der letzte bekannte ETag an den Client gesendet. Dieser Eintrag legt fest, dass die angforderte Resource nur dann an den Client gesendet werden soll, wenn sie sich seit dem letzten Abruf geändert hat. Mit GetResponse wird die Antwort des Servers abgerufen. Kommt es dabei zu einer WebException, wird geprüft, ob es sich beim übermittelten HTTP-Statuscode um den Wert 304 (Not Modified) handelt. Ist dem so, wurde das Dokument in der Zwischenzeit nicht geändert. Ansonsten ist ein (anderer) Fehler aufgetreten. Wurde die Resource zum Client gesendet, wird sie unter Verwendung des DataContractSerializer in ein Objekt übergefürt.

[…]
private static string lastETag = null;

private static void FindFlight()
{
    WebRequest request;
    WebResponse response = null;

    request = WebRequest.Create("http://localhost:4924/FlugService.svc/flight/LH0815");

    if (!string.IsNullOrEmpty(lastETag))
    {
        request.Headers["If-None-Match"] = lastETag;
    }

    try
    {
            response = request.GetResponse();
    }
    catch (WebException e)
    {
        HttpWebResponse r = e.Response as HttpWebResponse;
        if (r.StatusCode == HttpStatusCode.NotModified)
        {
            Console.WriteLine("Keine Änderung!");
        }
        else
        {
            Console.WriteLine(e.Message);
        }
        return;
    }
           
    lastETag = response.Headers["ETag"];

    DataContractSerializer s = new DataContractSerializer(typeof(Flug));
    Flug f = (Flug)s.ReadObject(response.GetResponseStream());

    Console.WriteLine(f.FulgNummer + ", Version: " + f.Version);
}

 

Kategorien: .Net 4 | WCF