簡體   English   中英

不在.NET Core中處置流

[英]Not disposing stream in .NET Core

考慮一下ASP.NET Core的ResponseBufferingMiddleware:

public class ResponseBufferingMiddleware
{
    private readonly RequestDelegate _next;

    public ResponseBufferingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        var originalResponseBody = httpContext.Response.Body;

        // no-op if buffering is already available.
        if (originalResponseBody.CanSeek)
        {
            await _next(httpContext);
            return;
        }

        var originalBufferingFeature = httpContext.Features.Get<IHttpBufferingFeature>();
        var originalSendFileFeature = httpContext.Features.Get<IHttpSendFileFeature>();
        try
        {
            // Shim the response stream
            var bufferStream = new BufferingWriteStream(originalResponseBody);
            httpContext.Response.Body = bufferStream;
            httpContext.Features.Set<IHttpBufferingFeature>(new HttpBufferingFeature(bufferStream, originalBufferingFeature));
            if (originalSendFileFeature != null)
            {
                httpContext.Features.Set<IHttpSendFileFeature>(new SendFileFeatureWrapper(originalSendFileFeature, bufferStream));
            }

            await _next(httpContext);

            // If we're still buffered, set the content-length header and flush the buffer.
            // Only if the content-length header is not already set, and some content was buffered.
            if (!httpContext.Response.HasStarted && bufferStream.CanSeek && bufferStream.Length > 0)
            {
                if (!httpContext.Response.ContentLength.HasValue)
                {
                    httpContext.Response.ContentLength = bufferStream.Length;
                }
                await bufferStream.FlushAsync();
            }
        }
        finally
        {
            // undo everything
            httpContext.Features.Set(originalBufferingFeature);
            httpContext.Features.Set(originalSendFileFeature);
            httpContext.Response.Body = originalResponseBody;
        }
    }
}

鏈接到實際文件: https : //github.com/aspnet/BasicMiddleware/blob/dev/src/Microsoft.AspNetCore.Buffering/ResponseBufferingMiddleware.cs

為什么這不是內存泄漏? 他們創建了一個新的BufferingWriteStream( https://github.com/aspnet/BasicMiddleware/blob/dev/src/Microsoft.AspNetCore.Buffering/BufferingWriteStream.cs ),但從未對其進行處理。 請求完成后,HTTP管道會自動處理流嗎?

此流只是您在其構造函數中傳遞的其他流的包裝(在本例中為originalResponseBody )。 這樣-不需要處理它-它本身不包含它可以清除\\釋放的任何非托管資源,也不包含它應處理的任何其他一次性組件,因此沒有理由實現IDisposable ,但是它從已經實現它的類繼承。 它只是將所有Stream方法(例如Read等)代理給包裝的流,並帶有一些附加邏輯(緩沖)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM