app.UseDeveloperExceptionPage()
如果在方法中添加到IApplicationBuilder
MVC(app.UseMvc()
)之后,Developer Exception Page()为空白Startup.cs
Configure
.
如果在MVC之前添加,Developer Exception Page工作正常.
这种行为是故意还是做错了?
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
Kévin Chalet.. 5
您所看到的行为完全是故意的:在ASP.NET 5中,中间件的执行顺序与注册时相同.
在MVC之后注册开发人员异常页面中间件时,它没有机会捕获控制器操作引发的异常(因为它甚至没有被调用).因此,服务器(Kestrel)拦截了异常,返回500响应,这就是您看到"空白页面"的原因.
您所看到的行为完全是故意的:在ASP.NET 5中,中间件的执行顺序与注册时相同.
在MVC之后注册开发人员异常页面中间件时,它没有机会捕获控制器操作引发的异常(因为它甚至没有被调用).因此,服务器(Kestrel)拦截了异常,返回500响应,这就是您看到"空白页面"的原因.
即使您得到了答案,我想发布一个解释,说明为什么添加异常中间件不能捕获任何添加之前的内容.
因此,您有一个使用中间件构建的管道.每个中间件(通常)将调用其后添加的中间件.所以你有类似的东西:
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
尚未调用或已经完成.