在调用IAppBuilder.Run方法后,为什么MVC处理程序没有执行?

时间:2015-09-20 06:43:14

标签: asp.net-mvc owin katana

在通过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模块?

1 个答案:

答案 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