Request-Lebenszyklus
Diese Seite wurde automatisch aus dem Englischen übersetzt. Original lesen
Im Folgenden wird der gesamte Lebenszyklus einer Anfrage anhand eines Beispiels einer HTTP‑Anfrage erklärt.
- Empfangen der Anfrage: Jede Anfrage erzeugt einen HTTP‑Kontext zwischen der eigentlichen Anfrage und der Antwort, die dem Client zugestellt wird. Dieser Kontext stammt vom integrierten Listener in Sisk, der entweder HttpListener, Kestrel oder Cadente sein kann.
- Externe Anfragenvalidierung: Die Validierung von HttpServerConfiguration.RemoteRequestsAction wird für die Anfrage durchgeführt.
- Ist die Anfrage extern und ist die Eigenschaft
Drop, wird die Verbindung ohne Antwort an den Client geschlossen mit einemHttpServerExecutionStatus = RemoteRequestDropped.
- Ist die Anfrage extern und ist die Eigenschaft
- Forwarding‑Resolver‑Konfiguration: Ist ein ForwardingResolver konfiguriert, ruft er die Methode OnResolveRequestHost auf dem ursprünglichen Host der Anfrage auf.
- DNS‑Abgleich: Nachdem der Host aufgelöst wurde und mehr als ein ListeningHost konfiguriert ist, sucht der Server nach dem entsprechenden Host für die Anfrage.
- Falls kein ListeningHost passt, wird dem Client eine 400 Bad Request‑Antwort zurückgegeben und dem HTTP‑Kontext der Status
HttpServerExecutionStatus = DnsUnknownHostübermittelt. - Passt ein ListeningHost, dessen Router jedoch noch nicht initialisiert ist, wird dem Client eine 503 Service Unavailable‑Antwort zurückgegeben und dem HTTP‑Kontext der Status
HttpServerExecutionStatus = ListeningHostNotReadyübermittelt.
- Falls kein ListeningHost passt, wird dem Client eine 400 Bad Request‑Antwort zurückgegeben und dem HTTP‑Kontext der Status
- Router‑Bindung: Der Router des entsprechenden ListeningHost wird dem empfangenen HTTP‑Server zugeordnet.
- Ist der Router bereits einem anderen HTTP‑Server zugeordnet, was nicht zulässig ist, weil der Router aktiv die Konfigurationsressourcen des Servers nutzt, wird eine
InvalidOperationExceptionausgelöst. Dies geschieht nur während der Initialisierung des HTTP‑Servers, nicht bei der Erstellung des HTTP‑Kontexts.
- Ist der Router bereits einem anderen HTTP‑Server zugeordnet, was nicht zulässig ist, weil der Router aktiv die Konfigurationsressourcen des Servers nutzt, wird eine
- Vordefinition von Headern:
- Definiert den Header
X-Request-Idin der Antwort vor, falls dies konfiguriert ist. - Definiert den Header
X-Powered-Byin der Antwort vor, falls dies konfiguriert ist.
- Definiert den Header
- Validierung der Inhaltsgröße: Prüft, ob der Anfrageninhalt kleiner ist als HttpServerConfiguration.MaximumContentLength (standardmäßig 100 MB), sofern er größer als null ist.
- Sendet die Anfrage ein
Content-Length, das größer ist als das konfigurierte, wird dem Client eine 413 Payload Too Large‑Antwort zurückgegeben und dem HTTP‑Kontext der StatusHttpServerExecutionStatus = ContentTooLargeübermittelt.
- Sendet die Anfrage ein
- Das Ereignis
OnHttpRequestOpenwird für alle konfigurierten HTTP‑Server‑Handler aufgerufen.
- Externe Anfragenvalidierung: Die Validierung von HttpServerConfiguration.RemoteRequestsAction wird für die Anfrage durchgeführt.
- Routing der Aktion: Der Server ruft den Router für die empfangene Anfrage auf.
- Findet der Router keine Route, die zur Anfrage passt:
- Ist die Eigenschaft Router.NotFoundErrorHandler konfiguriert, wird die Aktion aufgerufen und die Antwort der Aktion an den HTTP‑Client weitergeleitet.
- Ist die vorherige Eigenschaft null, wird dem Client eine standardmäßige 404 Not Found‑Antwort zurückgegeben.
- Findet der Router eine passende Route, aber die Methode der Route stimmt nicht mit der Methode der Anfrage überein:
- Ist die Eigenschaft Router.MethodNotAllowedErrorHandler konfiguriert, wird die Aktion aufgerufen und die Antwort der Aktion an den HTTP‑Client weitergeleitet.
- Ist die vorherige Eigenschaft null, wird dem Client eine standardmäßige 405 Method Not Allowed‑Antwort zurückgegeben.
- Ist die Anfrage von der Methode
OPTIONS:- Gibt der Router nur dann eine 200 Ok‑Antwort an den Client zurück, wenn keine Route mit der Anfragemethode übereinstimmt (die Methode der Route ist nicht explizit RouteMethod.Options).
- Ist die Eigenschaft HttpServerConfiguration.ForceTrailingSlash aktiviert, die gefundene Route kein Regex ist, der Anforderungspfad nicht mit
/endet und die AnfragemethodeGETist:- Wird dem Client eine 307 Temporary Redirect‑HTTP‑Antwort mit dem
Location‑Header zurückgegeben, der Pfad und Abfrage zur gleichen Adresse mit einem abschließenden/enthält.
- Wird dem Client eine 307 Temporary Redirect‑HTTP‑Antwort mit dem
- Das Ereignis
OnContextBagCreatedwird für alle konfigurierten HTTP‑Server‑Handler aufgerufen. - Alle globalen IRequestHandler-Instanzen mit dem Flag
BeforeResponsewerden ausgeführt.- Gibt ein Handler eine nicht‑null‑Antwort zurück, wird diese Antwort an den HTTP‑Client weitergeleitet und der Kontext geschlossen.
- Wird in diesem Schritt ein Fehler ausgelöst und ist HttpServerConfiguration.ThrowExceptions deaktiviert:
- Ist die Eigenschaft Router.CallbackErrorHandler aktiviert, wird sie aufgerufen und die resultierende Antwort dem Client zurückgegeben.
- Ist die vorherige Eigenschaft nicht definiert, wird eine leere Antwort an den Server zurückgegeben, der dann eine Antwort basierend auf dem Typ der ausgelösten Ausnahme weiterleitet, üblicherweise 500 Internal Server Error.
- Alle IRequestHandler-Instanzen, die in der Route definiert sind und das Flag
BeforeResponsebesitzen, werden ausgeführt.- Gibt ein Handler eine nicht‑null‑Antwort zurück, wird diese Antwort an den HTTP‑Client weitergeleitet und der Kontext geschlossen.
- Wird in diesem Schritt ein Fehler ausgelöst und ist HttpServerConfiguration.ThrowExceptions deaktiviert:
- Ist die Eigenschaft Router.CallbackErrorHandler aktiviert, wird sie aufgerufen und die resultierende Antwort dem Client zurückgegeben.
- Ist die vorherige Eigenschaft nicht definiert, wird eine leere Antwort an den Server zurückgegeben, der dann eine Antwort basierend auf dem Typ der ausgelösten Ausnahme weiterleitet, üblicherweise 500 Internal Server Error.
- Die Aktion des Routers wird aufgerufen und in eine HTTP‑Antwort umgewandelt.
- Wird in diesem Schritt ein Fehler ausgelöst und ist HttpServerConfiguration.ThrowExceptions deaktiviert:
- Ist die Eigenschaft Router.CallbackErrorHandler aktiviert, wird sie aufgerufen und die resultierende Antwort dem Client zurückgegeben.
- Ist die vorherige Eigenschaft nicht definiert, wird eine leere Antwort an den Server zurückgegeben, der dann eine Antwort basierend auf dem Typ der ausgelösten Ausnahme weiterleitet, üblicherweise 500 Internal Server Error.
- Wird in diesem Schritt ein Fehler ausgelöst und ist HttpServerConfiguration.ThrowExceptions deaktiviert:
- Alle globalen IRequestHandler-Instanzen mit dem Flag
AfterResponsewerden ausgeführt.- Gibt ein Handler eine nicht‑null‑Antwort zurück, ersetzt die Antwort des Handlers die vorherige Antwort und wird sofort an den HTTP‑Client weitergeleitet.
- Wird in diesem Schritt ein Fehler ausgelöst und ist HttpServerConfiguration.ThrowExceptions deaktiviert:
- Ist die Eigenschaft Router.CallbackErrorHandler aktiviert, wird sie aufgerufen und die resultierende Antwort dem Client zurückgegeben.
- Ist die vorherige Eigenschaft nicht definiert, wird eine leere Antwort an den Server zurückgegeben, der dann eine Antwort basierend auf dem Typ der ausgelösten Ausnahme weiterleitet, üblicherweise 500 Internal Server Error.
- Alle IRequestHandler-Instanzen, die in der Route definiert sind und das Flag
AfterResponsebesitzen, werden ausgeführt.- Gibt ein Handler eine nicht‑null‑Antwort zurück, ersetzt die Antwort des Handlers die vorherige Antwort und wird sofort an den HTTP‑Client weitergeleitet.
- Wird in diesem Schritt ein Fehler ausgelöst und ist HttpServerConfiguration.ThrowExceptions deaktiviert:
- Ist die Eigenschaft Router.CallbackErrorHandler aktiviert, wird sie aufgerufen und die resultierende Antwort dem Client zurückgegeben.
- Ist die vorherige Eigenschaft nicht definiert, wird eine leere Antwort an den Server zurückgegeben, der dann eine Antwort basierend auf dem Typ der ausgelösten Ausnahme weiterleitet, üblicherweise 500 Internal Server Error.
- Findet der Router keine Route, die zur Anfrage passt:
- Verarbeiten der Antwort: Sobald die Antwort bereit ist, bereitet der Server sie für das Senden an den Client vor.
- Die Header der Cross‑Origin Resource Sharing‑Policy (CORS) werden in der Antwort gemäß der im aktuellen ListeningHost.CrossOriginResourceSharingPolicy konfigurierten Richtlinie festgelegt.
- Der Statuscode und die Header der Antwort werden an den Client gesendet.
- Der Antwortinhalt wird an den Client gesendet:
- Ist der Antwortinhalt ein Nachfolger von ByteArrayContent, werden die Antwortbytes direkt in den Ausgabestream der Antwort kopiert.
- Wird die vorherige Bedingung nicht erfüllt, wird die Antwort in einen Stream serialisiert und in den Ausgabestream der Antwort kopiert.
- Die Streams werden geschlossen und der Antwortinhalt verworfen.
- Ist HttpServerConfiguration.DisposeDisposableContextValues aktiviert, werden alle im Anforderungskontext definierten Objekte, die von IDisposable erben, verworfen.
- Das Ereignis
OnHttpRequestClosewird für alle konfigurierten HTTP‑Server‑Handler aufgerufen. - Wurde auf dem Server eine Ausnahme ausgelöst, wird das Ereignis
OnExceptionfür alle konfigurierten HTTP‑Server‑Handler aufgerufen. - Erlaubt die Route Zugriffs‑Logging und ist HttpServerConfiguration.AccessLogsStream nicht null, wird eine Log‑Zeile in die Log‑Ausgabe geschrieben.
- Erlaubt die Route Fehler‑Logging, liegt eine Ausnahme vor und ist HttpServerConfiguration.ErrorsLogsStream nicht null, wird eine Log‑Zeile in die Fehler‑Log‑Ausgabe geschrieben.
- Wartet der Server über HttpServer.WaitNext auf eine Anfrage, wird das Mutex freigegeben und der Kontext dem Benutzer zur Verfügung gestellt.