Żądanie opróżniania przy użyciu serwera internetowego platformy ASP.NET Core Kestrel

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 lub Transfer-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ł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.