Vyžádání vyprázdnění webového serveru ASP.NET Core Kestrel
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Otevírání připojení HTTP je časově náročné. Pro PROTOKOL HTTPS je také náročný na prostředky. Kestrel Proto se pokusíte znovu použít připojení podle protokolu HTTP/1.1. Tělo požadavku musí být plně využité, aby bylo možné znovu použít připojení. Aplikace vždy nevyužívají tělo požadavku, například požadavky HTTP POST, ve kterých server vrací přesměrování nebo odpověď 404. V případě přesměrování HTTP POST:
- Klient už možná odeslal část dat POST.
- Server zapíše odpověď 301.
- Připojení nelze použít pro nový požadavek, dokud nebudou plně přečtena data POST z předchozího textu požadavku.
- Kestrel se pokusí vyprázdnit tělo požadavku. Vyprázdnění textu požadavku znamená čtení a zahození dat bez jejich zpracování.
Proces vyprazdňování představuje kompromis mezi povolením opětovného použití připojení a časem potřebným k vyprázdnění zbývajících dat:
- Vyprazdňování má časový limit 5 sekund, který není možné konfigurovat.
- Pokud se před vypršením časového limitu nepřečtou všechna data zadaná
Content-Length
hlavičkou neboTransfer-Encoding
záhlaví, připojení se zavře.
Někdy může být vhodné žádost okamžitě ukončit před napsání odpovědi nebo po ní. Klienti můžou mít například omezující limit dat. Omezení nahraných dat může být prioritou. V takových případech ukončete požadavek voláním HttpContext.Abort z kontroleru, Razor stránky nebo middlewaru.
Existuje upozornění na volání Abort
:
- Vytváření nových připojení může být pomalé a nákladné.
- Neexistuje žádná záruka, že klient před ukončením připojení přečte odpověď.
- Volání
Abort
by mělo být vzácné a vyhrazeno pro závažné případy chyb, nikoli běžné chyby.- Zavolejte
Abort
jenom v případech, kdy je potřeba vyřešit konkrétní problém. Volání například vAbort
případě, že se klienti se zlými úmysly zkouší data POST nebo když v kódu klienta dojde k chybě, která způsobuje velké nebo několik požadavků. - Nevolejte
Abort
běžné chybové situace, například HTTP 404 (Nenalezena).
- Zavolejte
Volání httpResponse.CompleteAsync před voláním Abort
zajistí, že server dokončil zápis odpovědi. Chování klienta ale není předvídatelné a nemusí před přerušením připojení číst odpověď.
Tento proces se u protokolu HTTP/2 liší, protože protokol podporuje přerušení jednotlivých datových proudů požadavků bez zavření připojení. Časový limit pětisekundového vyprázdnění se nepoužije. Pokud jsou po dokončení odpovědi nějaká nepřečtená data požadavku, odešle server rámec HTTP/2 RST. Další datové rámce textu požadavku se ignorují.
Pokud je to možné, je lepší, aby klienti používali hlavičku požadavku Expect: 100-continue a počkejte, než server odpoví, než začne odesílat text požadavku. To klientovi dává příležitost prozkoumat odpověď a přerušit před odesláním nepotřebných dat.