Erweiterte Möglichkeiten mit Web API (Teil 2)
Kommentare

Analog zum Zugriff auf die Kopfzeilen der Antwort kann der Entwickler auch auf die Kopfzeilen der Anfrage zugreifen. Diese ist vom Typ HttpRequestMessage und kann in der aktuellen BETA 1 innerhalb eines

Analog zum Zugriff auf die Kopfzeilen der Antwort kann der Entwickler auch auf die Kopfzeilen der Anfrage zugreifen. Diese ist vom Typ HttpRequestMessage und kann in der aktuellen BETA 1 innerhalb eines ApiControllers über this.Request erreicht werden. In künftigen Versionen soll sie jedoch auch von WebAPI, wie in Listing 4 mit dem Kommentar in der Signatur von Get angedeutet, injiziert werden können. Das funktioniert zwar prinzipiell schon jetzt, führt dann aber in weiterer Folge bei Verwendung von Parametern zu Problemen.

Das HttpRequestMessage-Objekt wird in Listing 4 verwendet, um den Kopfzeileneintrag If-None-Match in Erfahrung zu bringen. Dieser findet bei der Implementierung von Conditional Get-Szenarien Verwendung. Conditional Get bedeutet, dass der Aufrufer eine Ressource nur dann haben möchte, wenn eine bestimmte Bedingung erfüllt ist, beispielsweise, wenn die Ressource seit dem letzten Abrufen geändert wurde. Im Fall von If-None-Match gibt der Aufrufer dazu einen so genannten Entity-Tag (ETag) an. Ein ETag steht für den aktuellen Zustand einer Ressource und muss sich per Definition ändern, wenn die Ressource geändert wird. Hierbei kann es sich zum Beispiel um einen Hash-Wert, dem Zeitstempel der letzten Änderung oder um eine Versionsnummer handeln. Hat die angeforderte Ressource nach wie vor den angegebenen ETag, muss sie nicht erneut übertragen werden. In diesem Fall liefert der Service den HTTP-Status Not Modified (304) zurück. Haben sich jedoch der ETag und somit auch die gewünschte Ressource in der Zwischenzeit geändert, liefert der Service diese zurück, wobei der aktuelle ETag innerhalb der Kopfzeilen positioniert wird.

Listing 4
    private string Quote(string str)
    {
        return """ + str + """;
    }
 
    public HttpResponseMessage Get(int id/*, HttpRequestMessage request*/)
    {
        var request = this.Request; // HACK für BETA1
 
        var rep = new HotelBuchungRepository();
        var buchung = rep.FindById(id);
 
        if (buchung == null)
        {
            return new HttpResponseMessage(HttpStatusCode.NotFound);
        }
 
        // ETags befinden sich per Definition 
        // in doppelten Anführungszeichen!! 
        var etag = Quote(buchung.Version.ToString());

        var ifNoneMatchHeader = request.Headers.IfNoneMatch.FirstOrDefault();
        if (ifNoneMatchHeader != null && ifNoneMatchHeader.Tag == etag)
        {
            return new HttpResponseMessage(HttpStatusCode.NotModified);
        }
 
        var response = new HttpResponseMessage(buchung);
        response.StatusCode = HttpStatusCode.OK;
        response.Headers.CacheControl = new CacheControlHeaderValue();
        response.Headers.CacheControl.NoCache = true;
        response.Headers.ETag = new EntityTagHeaderValue(etag);
        return response;
 
    }  

Dass die übermittelten Nutzdaten nicht zwangsläufig in typisierter Form gelesen werden müssen, veranschaulicht Listing 5. Die hier gezeigte Methode Put liest die Nutzdaten über einen Stream und gibt sie zu Demonstrationsgründen im Debug-Fenster aus. Mit dem Attribut FromUri in der Signatur wird angezeigt, dass sich die erwartete Id innerhalb des URL befindet und somit die Nutzdaten nicht gelesen werden müssen, um sie in Erfahrung zu bringen. Das verhindert, dass Web API im Vorfeld auf diese zugreift, was in der vorliegenden BETA 1 zur Folge hätte, dass der manuelle Zugriff über den Stream in weiterer Folge nicht möglich wäre.

Listing 5
    public void Put([FromUri]int id /*, HttpRequestMessage request*/)
    {
        var request = this.Request; // HACK für BETA1
        var stream = request.Content.ReadAsStreamAsync().Result;
 
        using (var r = new StreamReader(stream)) {
            Debug.WriteLine(r.ReadToEnd());
        }
    }
}  

Das erwartet Sie auf den kommenden Seiten:

  • Benutzerdefinierte Routen
  • Benutzerdefinierte Formate unterstützen
  • Formatter mit HttpClient verwenden
  • Querschnittsfunktionen mit Message Handler
  • Handler mit HttpClient
  • Services mit Self Hosting
  • SSL für Web API ohne IIS
  • Fazit
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -