我想在我的 ASP.NET Core 1.0 项目中编写自定义中间件,它将原始框架的 Http Response Stream 替换为我自己的,因此我将能够对其执行读/查找/写入操作(前 2 个在原始框架上是不可能的流)在进一步的代码中,即在动作或过滤器中。
我从以下代码开始:
public class ReplaceStreamMiddleware
{
protected RequestDelegate NextMiddleware;
public ReplaceStreamMiddleware(RequestDelegate next)
{
NextMiddleware = next;
}
public async Task Invoke(HttpContext httpContext)
{
using (var responseStream = new MemoryStream())
{
var fullResponse = httpContext.Response.Body;
httpContext.Response.Body = responseStream;
await NextMiddleware.Invoke(httpContext);
responseStream.Seek(0, SeekOrigin.Begin);
await responseStream.CopyToAsync(fullResponse);
}
}
}
以下代码的问题是,有时fullResponse
流在调用时已经关闭await responseStream.CopyToAsync(fullResponse);
,因此会引发异常无法访问已关闭的流。
当我在浏览器中加载页面然后在完全加载之前刷新时,这种奇怪的行为很容易观察到。
我想知道:
- 为什么会这样?
- 如何预防?
- 我的解决方案是个好主意还是有另一种方法来替换响应流?