.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.IOException
atı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
bufferThreshold
performans bir dosya akışı kullanılacağından daha yavaş olacaktır.
Eline sağlık