如果在MVC之后添加到IApplicationBuilder,则Developer Exception页面为空白

时间:2016-01-01 22:17:57

标签: c# exception-handling asp.net-core

开发者异常页面(app.UseDeveloperExceptionPage())如果在IApplicationBuilder app.UseMvc()方法中以MVC(Startup.cs)之后添加到Configure,则为空白。

Developer Exception Page added after MVC

如果在MVC之前添加,

Developer Exception Page工作正常。

enter image description here

enter image description here

这种行为是故意还是做错了?

  • Mac上的Visual Studio Code 0.10.6
  • Microsoft.AspNet.Diagnostics 1.0.0-rc1-final
  • Microsoft.AspNet.Mvc 6.0.0-rc1-final
  • DNX Mono 1.0.0-rc1-update1

2 个答案:

答案 0 :(得分:5)

您看到的行为完全有意:在ASP.NET 5中,中间件的执行顺序与注册时相同。

在MVC之后注册开发人员异常页面中间件时,它没有机会捕获控制器操作抛出的异常(因为它甚至没有被调用)。因此,服务器(Kestrel)拦截了异常,返回500响应,这就是您看到“空白页面”的原因。

答案 1 :(得分:5)

即使你得到了答案,我想发布一个解释,说明为什么添加异常中间件不能捕获之前添加的任何东西。

因此,您有一个使用中间件构建的管道。每个中间件(通常)将调用其后添加的中间件。所以你有类似的东西:

M1 -> M2 -> M3 -> M4 -> ... -> Mn

当请求进入时,它将转到M1,它可以执行以下操作:

  1. 进一步传递。
  2. 停止。
  3. 如果它进一步传递,那么中间件将有另一次机会在它返回时处理该请求。所以请求是这样的:

    Request | M1 | M2 | M3 | ... | Mn
    --------+----+----+----+-----+---
        X   |    |    |    |     |   
           -->   |    |    |     |   
            |  X |    |    |     |   
            |   -->   |    |     |   
            |    |  X |    |     |   
            |    |   -->   |     |   
            |    |    |  X |     |   
            |    |    |   -->    |   
            |    |    |    |    --> X 
            |    |    |    |    <--
            |    |    |   <--    |       
            |    |    |  X |     |       
            |    |   <--   |     |             
            |    |  X |    |     |       
            |   <--   |    |     |       
            |  X |    |    |     |       
           <--   |    |    |     |
        X   |    |    |    |     |
    

    每个中间件都是方法调用:

    M1() 
       // Do something before M2
       M2()
           // Do something before M3
           M3()
               ...
           // Do something after M3
       // Do something after M2
    

    因此,如果中间件发生任何事情,它前面的任何中间件都有机会对此作出反应。之后的任何事情,都不知道。例如。如果M2抛出异常,M1可以捕获它,因为M2M1的上下文中运行,但M3要么尚未调用,要么已经完成。