【发布时间】:2016-11-12 03:24:45
【问题描述】:
我想在我的 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); 时已经关闭,因此它会引发异常无法访问已关闭的 Stream。
当我在浏览器中加载页面然后刷新时很容易观察到这种奇怪的行为,在它完全加载之前。
我想知道:
- 为什么会这样?
- 如何预防?
- 我的解决方案是个好主意还是有其他方法可以替换响应流?
【问题讨论】:
标签: asp.net-core asp.net-core-1.0 asp.net-core-middleware