ASP.NET Core中,UseDeveloperExceptionPage扩展方法会吃掉异常
在ASP.NET Core中Startup类的Configure方法中,有一个扩展方法叫UseDeveloperExceptionPage,如下所示:
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
} app.UseStaticFiles();
app.UseCookiePolicy(); app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
UseDeveloperExceptionPage方法是所属DeveloperExceptionPageExtensions类的IApplicationBuilder扩展方法,这个方法是新建ASP.NET Core项目时默认加入Startup类中的,它的作用是ASP.NET Core在开发环境(Development环境)下用于展示异常信息页面,如下所示:

但是UseDeveloperExceptionPage方法有一个很坑的特性,那就是它会吃掉ASP.NET Core中Middleware管道中的异常。
我们来设想,假如我们定义了下面一个Middleware叫LoggerMiddleware,它使用try catch代码块,来记录所有发生在ASP.NET Core的Middleware管道中抛出的异常到日志:
public class LoggerMiddleware
{
private readonly RequestDelegate next; public LoggerMiddleware(RequestDelegate next)
{
this.next = next;
} public async Task Invoke(
Microsoft.AspNetCore.Http.HttpContext context)
{
Logger logger = LogManager.GetCurrentClassLogger();
//logger.Log(NLog.LogLevel.Info, "Log tracking start!"); try
{
await next.Invoke(context);
}
catch (Exception ex)
{
LogMessageGenerator logMessageGenerator = new LogMessageGenerator(() =>
{
return ex.GetType().FullName + "\r\n" + ex.StackTrace;
}); logger.Log(NLog.LogLevel.Error, ex, logMessageGenerator);
throw;
} //logger.Log(NLog.LogLevel.Info, "Log tracking end!");
}
}
还有其扩展类LoggerMiddlewareExtension:
public static class LoggerMiddlewareExtension
{
public static void UsePipelineLogger(this IApplicationBuilder app)
{
app.UseMiddleware<LoggerMiddleware>();
}
}
然后我在ASP.NET Core中Startup类的Configure方法中,将其(app.UsePipelineLogger)放在app.UseDeveloperExceptionPage方法前面:
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UsePipelineLogger(); if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
} app.UseStaticFiles();
app.UseCookiePolicy(); app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
然后你会发现当MVC Controller中抛出异常时,LoggerMiddleware中的try catch代码块捕获不到任何异常。最开始我相当纳闷,这异常怎么活生生地就被吃掉了呢?
后来我在ASP.NET Core中Startup类的Configure方法中,将app.UsePipelineLogger放在了app.UseDeveloperExceptionPage后面:
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{ if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
} app.UsePipelineLogger(); app.UseStaticFiles();
app.UseCookiePolicy(); app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
这下LoggerMiddleware中的try catch代码块就成功捕获到了MVC Controller中抛出的异常,这很明确地证明了是app.UseDeveloperExceptionPage方法的Middleware吃掉了ASP.NET Core管道中的异常。
虽然不知道app.UseExceptionHandler方法是不是也会吃掉异常,但是建议大家把捕获异常的Middleware(本例的app.UsePipelineLogger)方法,都放在app.UseDeveloperExceptionPage和app.UseExceptionHandler的后面!
ASP.NET Core中,UseDeveloperExceptionPage扩展方法会吃掉异常的更多相关文章
- [05]ASP.NET Core 中的 Main 方法
ASP.NET Core 中的 Main 方法 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开始学 ASP.NE ...
- ASP.NET Core 中的 Main 方法
ASP.NET Core 中的 Main 方法 在 ASP.NET Core 项目中,我们有一个名为Program.cs的文件.在这个文件中,我们有一个public static void Main( ...
- [小技巧]ASP.NET Core中如何预压缩静态文件
原文地址:Pre-compressed static files with ASP.NET Core 作者:Gunnar Peipman 译者:Lamond Lu 译文:https://www.cnb ...
- ASP.Net Core中处理异常的几种方法
本文将介绍在ASP.Net Core中处理异常的几种方法 1使用开发人员异常页面(The developer exception page) 2配置HTTP错误代码页 Configuring stat ...
- 在ASP.NET Core中构建路由的5种方法
原文链接 :https://stormpath.com/blog/routing-in-asp-net-core 在ASP.NET Core中构建路由的5种方法 原文链接 :https://storm ...
- C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法
C#调用接口注意要点 在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...
- ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图
原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...
- 如何设计出和 ASP.NET Core 中 Middleware 一样的 API 方法?
由于笔者时间有限,无法写更多的说明文本,且主要是自己用来记录学习点滴,请谅解,下面直接贴代码了(代码中有一些说明): 01-不好的设计 代码: using System; namespace Desi ...
- 解析Asp.net Core中使用Session的方法
2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Core中引 ...
随机推荐
- 【代码笔记】iOS-获得现在的时间(2015-09-11)
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...
- 从零开始学习html(十二)CSS布局模型——上
一.css布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了. 布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之 ...
- ubuntn中root密码设置和权限给予
个人理解: 1.安装ubuntn,会首先要求有一个账号密码设置,比如我设置的:用户名irt,密码**,这是一个普通账户,此时,超级管理账户root密码是空的: 2.给root账户设置密码,大概步骤见下 ...
- svn本地连接服务器失败,但是浏览器可以
tortoise svn无法连接到服务器,清空“Autherticate data”后,再进行更新,提交,log查看等操作,svn还是不提示输入用户名和密码,而是报: error: Unable to ...
- 解决跨域问题之anywhere
anywhere搭建服务,ionic PC端和手机端可以通过网址来查看网页效果.解决跨域问题 大家都知道编写完HTML代码后,可以直接在pc端的浏览器查看,但现在手机端越来越广泛了,想跟在pc端查看网 ...
- Android 监听手机GPS打开状态
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854942 本文出自[赵彦军的博客] GPS_Presenter package ...
- Django CMDB
cp:https://www.cnblogs.com/wupeiqi/articles/6192986.html https://www.cnblogs.com/sss4/p/10131953.htm ...
- 树莓派Pi2 使用入门
1. 材料和环境 树莓派Pi2, microSD卡(大于等于4G), 网线 官网下载: 系统镜像 Raspbian Jessie (https://downloads.raspberrypi.org/ ...
- jquery实现显示textarea输入字符数
起初会想到使用keyup.keydown.keypress或者是onchange事件,onchange需要失去焦点才触发, 其它三个有些对按住键盘某个键不放不生效,有些对使用中文输入法正在输入时统计不 ...
- 高通LCD的pwm背光驱动
发生异常的现象: msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭:测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM为低电平,失败的时候为高电平: 根据原理图: mpp是什么? ...