Aracılığıyla paylaş


ASP.NET Core Kestrel web sunucusu ile boşaltma isteği

HTTP bağlantılarını açmak zaman alır. HTTPS için de yoğun kaynak kullanır. Bu nedenle, Kestrel HTTP/1.1 protokolü başına bağlantıları yeniden oluşturmaya çalışır. Bağlantının yeniden kullanılmasına izin vermek için bir istek gövdesinin tamamen kullanılması gerekir. Uygulama her zaman sunucunun yeniden yönlendirme veya 404 yanıtı döndürdüğü HTTP POST istekleri gibi istek gövdesini kullanmaz. HTTP POST yeniden yönlendirme örneğinde:

  • İstemci POST verilerinin bir bölümünü zaten göndermiş olabilir.
  • Sunucu 301 yanıtını yazar.
  • Önceki istek gövdesindeki POST verileri tamamen okunana kadar bağlantı yeni bir istek için kullanılamaz.
  • Kestrel istek gövdesini boşaltmaya çalışır. İstek gövdesinin boşaltılması, verileri işlemeden okuma ve atma anlamına gelir.

Boşaltma işlemi, bağlantının yeniden kullanılmasına izin verme ile kalan verilerin boşaltılması için gereken süre arasında bir denge sağlar:

  • Boşaltma beş saniyelik bir zaman aşımına sahiptir ve bu da yapılandırılamaz.
  • veya Transfer-Encoding üst bilgisi tarafından Content-Length belirtilen tüm veriler zaman aşımından önce okunmamışsa, bağlantı kapatılır.

Bazen yanıtı yazmadan önce veya yazdıktan sonra isteği hemen sonlandırmak isteyebilirsiniz. Örneğin, istemcilerin kısıtlayıcı veri üst sınırı olabilir. Karşıya yüklenen verileri sınırlamak bir öncelik olabilir. Bu gibi durumlarda bir isteği sonlandırmak için bir denetleyiciden, Razor Sayfadan veya ara yazılımdan HttpContext.Abort'u çağırın.

çağrılması Abortgereken uyarılar vardır:

  • Yeni bağlantılar oluşturmak yavaş ve pahalı olabilir.
  • bağlantı kapanmadan önce istemcinin yanıtı okuduğunun garantisi yoktur.
  • Çağrı Abort nadir olmalı ve sık karşılaşılan hatalar için değil, ciddi hata durumları için ayrılmalıdır.
    • Yalnızca belirli bir sorunun çözülmesi gerektiğinde arayın Abort . Örneğin, kötü amaçlı istemciler POST verilerini deniyorsa veya istemci kodunda büyük veya çeşitli isteklere neden olan bir hata varsa çağır Abort .
    • HTTP 404 (Bulunamadı) gibi yaygın hata durumlarını çağırmayın Abort .

Çağrıdan önce HttpResponse.CompleteAsync çağrısı Abort sunucunun yanıtı yazmayı tamamlamış olmasını sağlar. Ancak istemci davranışı tahmin edilebilir değildir ve bağlantı durdurulmadan önce yanıtı okumayabilir.

Protokol, bağlantıyı kapatmadan tek tek istek akışlarını durdurmayı desteklediğinden bu işlem HTTP/2 için farklıdır. Beş saniyelik boşaltma zaman aşımı geçerli değildir. Yanıt tamamlandıktan sonra okunmamış istek gövdesi verileri varsa, sunucu bir HTTP/2 RST çerçevesi gönderir. Ek istek gövdesi veri çerçeveleri yoksayılır.

Mümkünse, istemcilerin Expect: 100-continue istek üst bilgisini kullanması ve istek gövdesini göndermeye başlamadan önce sunucunun yanıt vermesini beklemesi daha iyidir. Bu, istemciye gereksiz verileri göndermeden önce yanıtı inceleme ve durdurma fırsatı verir.