首頁 > 後端開發 > C++ > 如何在中間件中多次讀取ASP.NET Core Response.Body?

如何在中間件中多次讀取ASP.NET Core Response.Body?

Mary-Kate Olsen
發布: 2025-01-08 16:22:42
原創
754 人瀏覽過

How Can I Read the ASP.NET Core Response.Body Multiple Times in Middleware?

ASP.NET Core 中介軟體多次讀取 Response.Body

概述

在 ASP.NET Core 中,多次存取回應流可能具有挑戰性。本文探討了預設 Response.Body 行為的局限性,並提供了一種在自訂中間件中讀取響應流的解決方案。

背景

在 ASP.NET Core 中,Response.Body 是一個只寫屬性,這表示它並非旨在在同一請求週期內從中讀取。這是框架效能最佳化的組成部分,但如果您需要多次存取回應流,則可能會帶來困難。

「臨時」解決方案:替換回應流

文中提到的解決方案似乎不是最佳的,因為它涉及用 MemoryStream 取代 Response.Body 流以進行讀取。這確實是一種有效的方法,儘管有點間接。

為 Response.Body 啟用緩衝

從 ASP.NET Core 2.1 開始,有一種更好的方法可以多次存取回應流:啟用緩衝。新的 Request.EnableBuffering() 方法可用於將回應流升級到 FileBufferingReadStream,後者支援查找和多次讀取。

更新後的中間件解決方案

將請求緩衝整合到中間件相對簡單。以下程式碼示範如何操作:

<code class="language-csharp">public class ResponseRewindMiddleware
{
    private readonly RequestDelegate next;

    public ResponseRewindMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        Stream originalBody = context.Response.Body;

        try
        {
            using (var memStream = new MemoryStream())
            {
                context.Response.Body = memStream;

                await next(context);

                memStream.Position = 0;
                string responseBody = new StreamReader(memStream).ReadToEnd();

                memStream.Position = 0;
                await memStream.CopyToAsync(originalBody);
            }

        }
        finally
        {
            context.Response.Body = originalBody;
        }

    }
}</code>
登入後複製

結論

替換 Response.Body 流可以作為一種在中間件中多次讀取響應流的可行方法。但是,首選方法是使用 Request.EnableBuffering() 啟用回應流上的緩衝。

以上是如何在中間件中多次讀取ASP.NET Core Response.Body?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板