In ASP.NET Core kann der mehrfache Zugriff auf den Antwortstream eine Herausforderung darstellen. In diesem Artikel werden die Einschränkungen des Standardverhaltens „Response.Body“ untersucht und eine Lösung zum Lesen des Antwortstroms in benutzerdefinierter Middleware bereitgestellt.
In ASP.NET Core ist Response.Body eine schreibgeschützte Eigenschaft, was bedeutet, dass sie nicht dazu gedacht ist, innerhalb desselben Anforderungszyklus gelesen zu werden. Dies ist Teil der Leistungsoptimierung des Frameworks, kann jedoch zu Schwierigkeiten führen, wenn Sie mehrmals auf den Antwortstream zugreifen müssen.
Die im Artikel erwähnte Lösung scheint nicht optimal zu sein, da sie das Ersetzen des Response.Body-Streams durch einen MemoryStream zum Lesen beinhaltet. Dies ist in der Tat ein effektiver Ansatz, wenn auch etwas indirekt.
Ab ASP.NET Core 2.1 gibt es eine bessere Möglichkeit, mehrmals auf den Antwortstream zuzugreifen: Aktivieren Sie die Pufferung. Die neue Methode Request.EnableBuffering() kann verwendet werden, um den Antwortstream auf einen FileBufferingReadStream zu aktualisieren, der Suchvorgänge und mehrere Lesevorgänge unterstützt.
Die Integration der Anforderungspufferung in die Middleware ist relativ einfach. Der folgende Code zeigt, wie das geht:
<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>
Das Ersetzen des Response.Body-Streams kann eine praktikable Möglichkeit sein, den Antwortstream mehrmals in der Middleware zu lesen. Die bevorzugte Methode besteht jedoch darin, Request.EnableBuffering() zu verwenden, um die Pufferung für den Antwortstream zu aktivieren.
Das obige ist der detaillierte Inhalt vonWie kann ich den ASP.NET Core Response.Body mehrmals in Middleware lesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!