我一直在努力Response.Body
从ASP.NET核心操作中获取属性,而我能够识别的唯一解决方案似乎不是最佳的.该解决方案需要Response.Body
在一段MemoryStream
时间内将流读取到字符串变量中,然后在发送到客户端之前将其交换回来.在下面的示例中,我试图Response.Body
在自定义中间件类中获取值. Response.Body
是一个集在ASP.NET核心出于某种原因唯一的财产?我在这里遗漏了什么,或者这是一个疏忽/错误/设计问题?有更好的阅读方式Response.Body
吗?
当前(次优)解决方案:
public class MyMiddleWare
{
private readonly RequestDelegate _next;
public MyMiddleWare(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
using (var swapStream = new MemoryStream())
{
var originalResponseBody = context.Response.Body;
context.Response.Body = swapStream;
await _next(context);
swapStream.Seek(0, SeekOrigin.Begin);
string responseBody = new StreamReader(swapStream).ReadToEnd();
swapStream.Seek(0, SeekOrigin.Begin);
await swapStream .CopyToAsync(originalResponseBody);
context.Response.Body = originalResponseBody;
}
}
}
Run Code Online (Sandbox Code Playgroud)
尝试使用EnableRewind()的解决方案:
这仅适用于Request.Body
,而不是Response.Body
.这导致从而Response.Body
不是实际的响应主体内容中读取空字符串. …