ASP.NET Core2.2 IExceptionFilter
用vs2017建立一个ASP.NET Core Web应用程序并选择MVC框架,自动生成了 Startup的类,并配置了错误处理方式:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
简单讲:
- 开发环境,直接在当前页面显示错误
- 生产环境:跳转到 /Home/Error页面
而在实际开发和生产过程中,我们需要:
- 开发环境,我们有时候会用到ajax调用,需要快速定位错误(比如alert(....))
- 生产环境:我们需要把错误信息保存起来,当然ajax调用的时候不能直接alert一个/Home/Error的html给用户
如下面的代码:
Action:
public IActionResult Edit(int id = 0)
{
if (id == 0) //模拟用户不能修改该Id的内容
return NotFound("没有操作权限");
if (id == 1) //模拟发生异常了
throw new Exception("错误:error desc");
return View();
}
/// <summary>
/// ajax调用
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost]
public IActionResult Save(int id = 0)
{
if (id == 0) //模拟用户不能修改该Id的内容
return NotFound("没有操作权限");
if (id == 1) //模拟发生异常了
throw new Exception("错误:error desc");
return Content(id + DateTime.Now.ToString());
}
View(Edit.cshtml)
<div class="text-center">
id:
<input type="text" id="TId" />
<input type="button" value="Save" id="BSave" />
<span id="SResult"></span>
</div>
@section scripts
{
<script>
$(function () {
$("#BSave").click(function () {
$.ajax({
type: "post",
url: "@Url.Action("Save")",
data: { id: $("#TId").val() },
success: function (ret) {
$("#SResult").html(ret);
},
error: function (XMLHttpRequest) {
if (XMLHttpRequest.responseText != "") {
alert(XMLHttpRequest.responseText);
}
else
alert(XMLHttpRequest.status );
}
});
});
});
</script>
}
Ctrl+F5##运行:
好,我们需要保存错误信息,并更友好的提示ajax调用错误。
1.添加一个类
public class FilterException : IExceptionFilter
{
private readonly YKDbContext db;
private readonly IHostingEnvironment _Env;
public FilterException(YKDbContext dbContext, IHostingEnvironment env)
{
db = dbContext;
_Env = env;
}
public void OnException(ExceptionContext context)
{
if (_Env.IsDevelopment())
{
if (context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest")
{
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
string msg = context.Exception.Message;
Exception ex = context.Exception;
while (ex.InnerException != null)
{
ex = ex.InnerException;
msg += ex.Message;
}
context.Result = new JsonResult(msg);
context.ExceptionHandled = true; // 表明异常已处理,客户端可得到正常返回
}
}
else
{
string msg = context.Exception.Message;
Exception ex = context.Exception;
while (ex.InnerException != null)
{
ex = ex.InnerException;
msg += ex.Message;
}
//存入db
if (context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest")
{
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
context.Result = new JsonResult("出错了!已经将错误信息发送给开发人员,开发人员将尽快处理。");
context.ExceptionHandled = true;
}
}
}
}
2.配置服务
在类Startup
的方法ConfigureServices
中修改
services.AddMvc(options =>
{
options.Filters.Add<FilterException>();
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
依然按##Ctrl+F5##运行:
是我们想要的结果吧?!
附:Filter里面如何判断Controller
是否有ApiController
属性
bool isApi = context.Filters.Any(ii => ii.GetType().Name == "ApiControllerAttribute");
ASP.NET Core2.2 IExceptionFilter的更多相关文章
- 一步一步带你做WebApi迁移ASP.NET Core2.0
随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...
- Asp.net Core2.0 缓存 MemoryCache 和 Redis
自从使用Asp.net Core2.0 以来,不停摸索,查阅资料,这方面的资料是真的少,因此,在前人的基础上,摸索出了Asp.net Core2.0 缓存 MemoryCache 和 Redis的用法 ...
- ASP.NET Core2.1 你不得不了解的GDPR(Cookie处理)
前言 时间一晃 ASP.NET Core已经迭代到2.1版本了. 迫不及待的的下载了最新的版本,然后生成了一个模版项目来试试水. ...然后就碰到问题了... 我发现..cookie竟然存不进去了.. ...
- 【4】Asp.Net Core2.2中间件多扩展对应应用
[前言] 上一篇完成了Asp.Net Core 2.2全新的管道处理模型解析,“俄罗斯套娃”式的委托嵌套和传递,组建了扩展性无与伦比的管道模型!与此同时,委托嵌套过于复杂,使用起来并不友好,然后多种扩 ...
- 【3】Asp.Net Core2.2新版管道处理模型
[前言] 上一篇完成了Asp.Net Core 2.2项目的一个最简单功能的添加,从控制器-视图-实体轻松交互了一下,感觉跟之前的MVC没啥差别!但这些都是在组件封装的基础上完成的,在Core里面,其 ...
- 在asp.net core2.1中添加中间件以扩展Swashbuckle.AspNetCore3.0支持简单的文档访问权限控制
Swashbuckle.AspNetCore3.0 介绍 一个使用 ASP.NET Core 构建的 API 的 Swagger 工具.直接从您的路由,控制器和模型生成漂亮的 API 文档,包括用于探 ...
- 从ASP.NET Core2.2到3.0你可能会遇到这些问题
趁着假期的时间所以想重新学习下微软的官方文档来巩固下基础知识.我们都知道微软目前已经发布了.NET Core3.0的第三个预览版,同时我家里的电脑也安装了vs2019.So,就用vs2019+.NET ...
- 【1】Asp.Net Core2.2从环境配置到应用建立
作者:Eleven 来源:公众号[软谋net] [前言] .Net Core开源&跨平台,已经肉眼可见将成为.Net平台的未来,在企业招聘需求上已经频频见到,接触到很多公司内部都已经开始尝试C ...
- 【翻译】asp.net core2.0中的token认证
原文地址:https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide token ...
随机推荐
- MySQL:(一)
数据库概述 什么是数据库 数据库是一个文件系统.通过标准SQL语言操作文件系统中数据——用来存放软件系统的数据! SQL:Structured Query Language 结构查询语言 常用数据库简 ...
- tcp和udp区别
1.TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接 2.TCP提供可靠的服务.也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP ...
- python 写文本文件出现乱码
最近工作中想完善一下监控日志,同事说客户突然说我们最近几天推送的数据只有几家,赶紧看预警,应推4700多家,实推3400多家,用户可能是看错了,但我记得当时项目验收上线时,这个来源的推送数据肯定是可以 ...
- Spring Cloud ----> 几个组件的总结
Spring Cloud Eureka 多个服务,对应多个Eureka Client 只有一个Eureka Server ,充当注册中心的角色每个Eureka Client 有ip 地址和端口号,它们 ...
- mac上运行window程序。
wine https://wiki.winehq.org/Wine_User%27s_Guide#Quick_start #使用brew brew install Caskroom/cask/xqua ...
- Vue2.0选中当前鼠标移入移除加样式
本人写的小程序,功能还在完善中,欢迎扫一扫提出宝贵意见! 效果如gif动态图所示: 1.通过v-for遍历数组 HTML代码: <template> <div class=" ...
- AOP之配置文件实现
看了http://www.cnblogs.com/xrq730/p/4919025.html这篇文章之后自己跟着做了一遍,有需要可以去看原文,比我写的更详细. AOP AOP(Aspect Orien ...
- Oracle扩展的统计信息
我们在收集列的统计信息与直方图时,往往都是对某一列的收集.当谓词使用多个相关列时,会导致约束条件的冗余.这几个相关的列也被称作关联列.出现这种情况时,查询优化器也会做出不准确的判断.所以我们必须对这些 ...
- python--日志模块
一.logging模块就是python里面用来操作日志的模块,logging模块中主要有4个类,分别负责不同的工作 1. Logger 记录器,暴露了应用程序代码能直接使用的接口:简单点说就是一个创建 ...
- 你所误解的微信公众号开发、以及微信公众号网页授权、接收url跳转参数等问题
前言:有一星期没跟新博客了,最近太忙.项目赶进度就没把时间花在博客上:今天来说说所谓的微信公众号开发和填坑记录: 微信公众号:运行在微信终端的应用 (对于开发者来说比较爽的你只需考虑兼容微信浏览器,因 ...