【发布时间】:2018-06-02 13:04:59
【问题描述】:
在我的 MVC 控制器操作执行后,我正在尝试获取响应的副本,但是从这里的其他问题来看,我无法让这段代码正常工作(尽管这似乎是一个很好回答的问题)......
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use(async (context, next) =>
{
var resultStream = context.Response.Body;
context.Response.Body = new MemoryStream();
// allow the response to be written in future request lifecycle events
await next.Invoke();
// fetch the repsonse
context.Response.Body.Seek(0, SeekOrigin.Begin);
var headers = context.Response.Headers;
var body = new StreamReader(context.Response.Body).ReadToEnd();
// ... other code omitted for question clarity
// write the response to the client
context.Response.Body.Seek(0, SeekOrigin.Begin);
await context.Response.Body.CopyToAsync(resultStream);
context.Response.Body = resultStream;
});
}
// ... other code omitted for question clarity
}
当我进行第二次搜索时,变量“body”为空。
任何想法为什么在此之后的结果是包含内容的页面时可能会出现这种情况?
【问题讨论】:
-
UseMvc()是否会立即跟随您的中间件.Use()调用? -
这看起来像是 ASP.NET Core 中间件,而不是 OWIN 中间件。
-
@RudiVisser 它没有,这也不是 .Net 核心,它是 .Net 4.6
-
@War 那么
next不是指您的控制器执行,这是唯一可行的方法吗?编辑:FullFx 与否我认为方法是相似的。您管道中的下一个中间件是什么?它必须是 MVC 中间件,否则您将无法获得控制器的结果。 EDIT2:实际上可能不是,因为您将等待整个管道完成.. 嗯 -
我不知道 next 指的是什么...... owin 是一个复杂的管道.. 但我的理解是,如果你调用并 await next 那么你调用整个管道而不仅仅是下一个中间件项在管线中。我看到我的控制器操作在 await next 和第一次 seek 调用之间被击中。
标签: c# asp.net-mvc httpresponse owin-middleware