Żądanie opróżniania przy użyciu serwera internetowego platformy ASP.NET Core Kestrel
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Otwieranie połączeń HTTP jest czasochłonne. W przypadku protokołu HTTPS jest on również intensywnie obciążany zasobami. Kestrel W związku z tym próbuje ponownie użyć połączeń na protokół HTTP/1.1. Treść żądania musi być w pełni wykorzystana, aby umożliwić ponowne użycie połączenia. Aplikacja nie zawsze używa treści żądania, na przykład żądań HTTP POST, w których serwer zwraca odpowiedź przekierowania lub 404. W przypadku przekierowania HTTP POST:
- Klient mógł już wysłać część danych POST.
- Serwer zapisuje odpowiedź 301.
- Nie można użyć połączenia dla nowego żądania, dopóki dane POST z poprzedniej treści żądania nie zostaną w pełni odczytane.
- Kestrel próbuje opróżnić treść żądania. Opróżnianie treści żądania oznacza odczytywanie i odrzucanie danych bez ich przetwarzania.
Proces opróżniania sprawia, że kompromis między zezwoleniem na ponowne użycie połączenia a czasem potrzebnym na opróżnienie pozostałych danych:
- Opróżnianie ma limit czasu 5 sekund, co nie jest konfigurowalne.
- Jeśli wszystkie dane określone przez
Content-Length
nagłówek lubTransfer-Encoding
nie zostały odczytane przed przekroczeniem limitu czasu, połączenie zostanie zamknięte.
Czasami możesz chcieć zakończyć żądanie natychmiast, przed lub po zapisaniu odpowiedzi. Na przykład klienci mogą mieć restrykcyjne limity danych. Ograniczenie przekazanych danych może być priorytetem. W takich przypadkach, aby zakończyć żądanie, wywołaj metodę HttpContext.Abort z kontrolera, Razor strony lub oprogramowania pośredniczącego.
Istnieją zastrzeżenia dotyczące wywoływania elementu Abort
:
- Tworzenie nowych połączeń może być powolne i kosztowne.
- Nie ma gwarancji, że klient odczytał odpowiedź przed zamknięciem połączenia.
- Wywołanie
Abort
powinno być rzadkie i zarezerwowane w przypadku poważnych przypadków błędów, a nie typowych błędów.- Wywołaj tylko
Abort
wtedy, gdy należy rozwiązać konkretny problem. Na przykład wywołaj metodęAbort
, jeśli złośliwi klienci próbują wysyłać dane POST lub gdy w kodzie klienta występuje usterka, która powoduje duże lub kilka żądań. - Nie należy wywoływać
Abort
typowych sytuacji błędów, takich jak HTTP 404 (nie znaleziono).
- Wywołaj tylko
Wywołanie metody HttpResponse.CompleteAsync przed wywołaniem Abort
gwarantuje, że serwer zakończył pisanie odpowiedzi. Jednak zachowanie klienta nie jest przewidywalne i może nie odczytać odpowiedzi przed przerwaniem połączenia.
Ten proces jest inny w przypadku protokołu HTTP/2, ponieważ protokół obsługuje przerywanie pojedynczych strumieni żądań bez zamykania połączenia. Pięciosekundowy limit czasu opróżniania nie ma zastosowania. Jeśli po zakończeniu odpowiedzi istnieją jakiekolwiek nieprzeczytane dane treści żądania, serwer wysyła ramkę HTTP/2 RST. Dodatkowe ramki danych treści żądania są ignorowane.
Jeśli to możliwe, lepiej jest, aby klienci używali nagłówka Oczekiwane żądanie: 100-kontynuuj i poczekaj, aż serwer odpowie przed rozpoczęciem wysyłania treści żądania. Dzięki temu klient może zbadać odpowiedź i przerwać przed wysłaniem niepotrzebnych danych.