【问题标题】:Developer Exception Page is blank if added to IApplicationBuilder after MVC如果在 MVC 之后添加到 IApplicationBuilder,开发人员异常页面为空白
【发布时间】:2016-04-06 06:17:27
【问题描述】:

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

如果在 MVC 之前添加,开发者异常页面可以正常工作。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      即使你得到了答案,我还是想解释一下为什么添加异常中间件不会捕获之前添加的任何内容。

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

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

      当一个请求进来时,它会转到M1,它可以做以下事情:

      1. 进一步传递。
      2. 停下来。

      如果它进一步传递,那么中间件将有另一个机会在它回来时处理请求。所以请求是这样的:

      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 要么尚未调用,要么已经完成。

      【讨论】:

        猜你喜欢
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-24
        • 1970-01-01
        相关资源
        最近更新 更多