开发者异常页面(app.UseDeveloperExceptionPage()
)如果在IApplicationBuilder
app.UseMvc()
方法中以MVC(Startup.cs
)之后添加到Configure
,则为空白。
Developer Exception Page工作正常。
这种行为是故意还是做错了?
答案 0 :(得分:5)
您看到的行为完全有意:在ASP.NET 5中,中间件的执行顺序与注册时相同。
在MVC之后注册开发人员异常页面中间件时,它没有机会捕获控制器操作抛出的异常(因为它甚至没有被调用)。因此,服务器(Kestrel)拦截了异常,返回500响应,这就是您看到“空白页面”的原因。
答案 1 :(得分:5)
即使你得到了答案,我想发布一个解释,说明为什么添加异常中间件不能捕获之前添加的任何东西。
因此,您有一个使用中间件构建的管道。每个中间件(通常)将调用其后添加的中间件。所以你有类似的东西:
M1 -> M2 -> M3 -> M4 -> ... -> Mn
当请求进入时,它将转到M1
,它可以执行以下操作:
如果它进一步传递,那么中间件将有另一次机会在它返回时处理该请求。所以请求是这样的:
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
可以捕获它,因为M2
在M1
的上下文中运行,但M3
要么尚未调用,要么已经完成。