在通过Microsoft.Owin.Host.SystemWeb.dll与OWIN(Katana)集成的MVC5中,为什么MVC处理程序在调用IAppBuilder.Run方法后没有执行,并且在IAppBuilder.Use方法之后执行调用
以下是我的实施:
案例1:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use( async (context, next) =>
{
await context.Response.WriteAsync(@"<h1>Before MVC</h1>");
await next.Invoke(); //What 's the "next" object now?
await context.Response.WriteAsync(@"<h1>After MVC</h1>");
});
}
}
案例2:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.Run( async context =>
{
await context.Response.WriteAsync(@"<h1>MVC has not been invoked.</h1>");
});
}
}
在这种情况下,据我所知,OWIN组件运行为HttpModule(OwinHttpModule),它在Asp.NET管道中注册。 那么为什么执行IAppBuilder.Run方法会导致跳过MVC模块?
答案 0 :(得分:2)
您可以找到有关Run
方法here
在OWIN管道中插入一个没有下一个的中间件 中间件参考
MVC处理程序在所有owin中间件组件(OMC)之后执行,这就是它跳过的原因。Use
方法只是添加新模块。 MVC处理程序将在所有模块之后运行。 await next.Invoke
将等待执行下一个OMC。阅读this篇文章。
尝试使用此代码
app.Use((context, next) =>
{
context.Response.WriteAsync("Hello, world.");
return Task.FromResult(0); //case 1
//return next.Invoke(); //case 2
});
案例1将仅返回hello world
案例2将附加hello world