Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya Boleh Membaca ASP.NET Core Response.Body Berbilang Kali dalam Middleware?

Bagaimanakah saya Boleh Membaca ASP.NET Core Response.Body Berbilang Kali dalam Middleware?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-08 16:22:42716semak imbas

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

Perisian tengah Teras ASP.NET membaca Response.Body beberapa kali

Ikhtisar

Dalam Teras ASP.NET, mengakses strim respons berbilang kali boleh menjadi mencabar. Artikel ini meneroka had kelakuan lalai Response.Body dan menyediakan penyelesaian untuk membaca aliran respons dalam perisian tengah tersuai.

Latar belakang

Dalam Teras ASP.NET, Response.Body ialah sifat tulis sahaja, yang bermaksud ia tidak bertujuan untuk dibaca dari dalam kitaran permintaan yang sama. Ini adalah sebahagian daripada pengoptimuman prestasi rangka kerja, tetapi boleh menyebabkan kesukaran jika anda perlu mengakses aliran respons beberapa kali.

Penyelesaian "Sementara": gantikan aliran respons

Penyelesaian yang disebut dalam artikel nampaknya tidak optimum kerana ia melibatkan penggantian Response.Body stream dengan MemoryStream untuk membaca. Ini sememangnya pendekatan yang berkesan, walaupun agak tidak langsung.

Dayakan penimbalan untuk Response.Body

Bermula dengan ASP.NET Core 2.1, terdapat cara yang lebih baik untuk mengakses strim tindak balas beberapa kali: dayakan penimbalan. Kaedah Request.EnableBuffering() baharu boleh digunakan untuk menaik taraf aliran respons kepada FileBufferingReadStream, yang menyokong carian dan berbilang bacaan.

Penyelesaian perisian tengah yang dikemas kini

Mengintegrasikan penimbalan permintaan ke dalam perisian tengah adalah agak mudah. Kod berikut menunjukkan cara melakukan ini:

<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>

Kesimpulan

Menggantikan Response.Body stream boleh menjadi cara yang berdaya maju untuk membaca aliran respons beberapa kali dalam middleware. Walau bagaimanapun, kaedah pilihan adalah menggunakan Request.EnableBuffering() untuk mendayakan penimbalan pada aliran respons.

Atas ialah kandungan terperinci Bagaimanakah saya Boleh Membaca ASP.NET Core Response.Body Berbilang Kali dalam Middleware?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn