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