
在 ASP.NET Core 中访问 Response.Body:一种改进的方法
由于其只写性质,在 ASP.NET Core 中直接读取 Response.Body 会带来挑战。 然而,存在有效的方法来检索其内容。
解决低效方法
之前涉及MemoryStream替换的解决方案虽然有效,但会带来性能开销。 EnableRewind方法适用于Request.Body,对Response.Body无效。
引入简化的中间件解决方案
最佳解决方案利用自定义中间件ResponseRewindMiddleware来优雅地处理Response.Body读取。该中间件拦截响应流,暂时将其重定向到 MemoryStream,处理请求,读取 MemoryStream 内容,然后无缝恢复原始流。
增强的中间件实施
这是 ResponseRewindMiddleware 的改进实现:
<code class="language-csharp">public class ResponseRewindMiddleware
{
private readonly RequestDelegate _next;
public ResponseRewindMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
var originalBody = context.Response.Body;
using (var memoryStream = new MemoryStream())
{
context.Response.Body = memoryStream;
await _next(context);
memoryStream.Seek(0, SeekOrigin.Begin);
using (var reader = new StreamReader(memoryStream))
{
var responseBody = await reader.ReadToEndAsync();
// Process responseBody here...
}
memoryStream.Seek(0, SeekOrigin.Begin);
await memoryStream.CopyToAsync(originalBody);
}
}
}</code>该中间件可以有效地捕获响应内容,而不会影响性能或数据完整性。 捕获的 responseBody 字符串可随时在中间件中进行进一步处理。 这种方法确保了一种干净有效的方式来访问响应正文内容。
以上是如何高效读取ASP.NET Core中的Response.Body属性?的详细内容。更多信息请关注PHP中文网其他相关文章!