.NET CORE EnableBuffering()

Merhabalar;
Bazı durumlarda isteklerin gövdelerini defalarca okumamız gerekebilir;

Örneğin reques body içeriğini işlemek için defalarca okuyan bir katman yazılımımız olabilir.

Genellikle Request.Body geri alınamaz bir kez okunur ve tamamlanır.
Basit bir çözüm olarak, içeriğin birkaç kez okunabilmesini sağlamak için akışın bir kopyasını aramayı destekleyen başka bir akışta saklamaktır.

ASP.NET Framework’de bir http isteğinin gövdesini HttpRequest.GetBufferedInputStream methodu kullanarak bir çok kez okumak mümkündür, fakat ASP.NET CORE’da farklı bir yaklaşım kullanılmalıdır.

ASP.NET Core 2.1 ile birlikte gelen EnableBuffering()istek gövdesini birkaç kez okumak için kullanılabilen bir metottur.

Örnek bir kullanım;

public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
    context.Request.EnableBuffering();

    // Leave the body open so the next middleware can read it.
    using (var reader = new StreamReader(
        context.Request.Body,
        encoding: Encoding.UTF8,
        detectEncodingFromByteOrderMarks: false,
        bufferSize: bufferSize,
        leaveOpen: true))
    {
        var body = await reader.ReadToEndAsync();
        // Do some processing with body…

        // Reset the request body stream position so the next middleware can read it
        context.Request.Body.Position = 0;
    }

    // Call the next delegate/middleware in the pipeline
    await next(context);
}

FileBufferingReadStream, önce belirli bir boyutta bellek akışını kullanır, ardından geçici bir dosya akışına geri döner. Varsayılan olarak, bellek akışının boyutu 30 KB’dir. EnableBuffering()Farklı bir eşik ve / veya toplam boyut için bir limit belirlenmesini sağlayan başka aşırı yüklemeler de vardır :

public static void EnableBuffering(this HttpRequest request, int bufferThreshold)

public static void EnableBuffering(this HttpRequest request, long bufferLimit)

public static void EnableBuffering(this HttpRequest request, int bufferThreshold, long bufferLimit)

Örneğin bir arama;

context.Request.EnableBuffering(bufferThreshold: 1024 * 45, bufferLimit: 1024 * 100);

100 KB sınırında bir okuma tamponu sağlar. İçerik 45KB’yi geçene kadar veriler arabelleğe alınır, ardından geçici bir dosyaya taşınır. Varsayılan olarak arabellek boyutunda bir sınır yoktur, ancak bir tane belirtilmişse ve istek gövdesinin içeriği sınırı aşıyorsa, bir System.IOExceptionatılır.

Bu aşırı yüklenmeler, tamponlama davranışlarında ince ayar yapılması gerektiğinde esneklik sunar. Sadece aklınızda bulundurun:

  • Bellek akışı bir havuzdan kiralansa da, onunla ilişkili bellek maliyeti hala vardır.
  • Okuma bittikten sonra bufferThresholdperformans bir dosya akışı kullanılacağından daha yavaş olacaktır.
IT alanında 16 sene önce donanım ile başlayan tecrübem, network ve sonrasında iş analizi, yazılım geliştirme ve proje yöneticiliği alanlarında devam etmiştir. Endüstriyel yazılımlar, sahadan veri toplama ve analizleri, otomatik etiketleme ve barkod sistemleri, otomatik tartım ve robotik konularında tecrübe sahibiyim. Sanayi 4.0 kapsamında imalat sanayinin dijital dönüşümünde çok fazla projenin hayata geçmesini sağladım. Open Source projelerle uzun süre ilgilendim, analiz ve implementasyonu konularında tecrübe edindim. Bunlar dışında hobi amacıyla başlasam da sonradan ürüne dönüşen, geliştirme kartları ile farklı çalışmalarım olmuştur. Raspberry Pi üzerinde yaptığım donanımsal ve yazılımsal işler ile çok farklı ürünler ortaya çıkartarak tecrübe edindim.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>