7.2WebApi2中的全局异常处理
现在在WebApi中还没有一种简单的方式去记录或者处理全局的异常。一些未处理的异常可以处理通过异常过滤器,但有大量的异常是异常过滤器不能处理的。例如:
- 从控制器的构造函数引发的异常。
- 从消息处理程序引发的异常。
- 在路由过程中引发的异常。
- 在响应内容序列化期间引发的异常。
我们需要提供简单、 一致的方式来记录和处理 (如果可能) 这些异常。
处理异常有两种方式,其中一种我们可以发送一个错误响应;另外一种我们可以在那里记录日志异常,举个例子就是引发异常是在响应流的内容时,在这个时候处理就太晚了,因为这时响应码,标题和部分响应内容已经在传输上了,所以我们只是中断连接发送响应消息。即使不能处理该异常,我们仍能记录异常日志,在那里我们可以检测到错误的情况下,返回相应的错误响应,如下所示:
public IHttpActionResult GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}
现有的选项
解决方案概述
我们提供两个用户可更换的服务, IExceptionLogger和 IExceptionHandler,来记录和处理未处理的异常。服务是很相似,但是也有两个主要区别 ︰
- 我们支持注册多个异常记录器,但只有一个单一的异常处理程序。
- 异常的记录器总是会调用,即使我们要中止连接。异常处理程序只会调用时我们仍然能够以选择要发送的响应消息。
这两种服务提供访问异常上下文包含异常检测到的点、 特别是HttpRequestMessage、 HttpRequestContext、 抛出的异常和异常源 (细节如下) 的相关信息。
设计原则
1.没有重大更改
因为在次要版本中,一个重要的制约因素影响的解决方案是,有没有重大的更改,或者键入合同或行为正在添加此功能。此约束排除我们想在现有车削成 500 反应异常的 catch 块做了一些清理。这额外的清理是我们可能会考虑后续的主要版本。如果这是重要的您在ASP.NET Web API 用户声音请投票.
2.保持一致性与 Web API 构建
Web API 的滤清器管道是一个伟大的方式来处理横切关注点的逻辑在特定操作、 控制器具体或全球范围内的应用灵活性。过滤器,包括异常筛选器,总是有行动和控制器的情况下,即使在全球范围内注册。合同有道理的筛选器,但它意味着异常筛选器,甚至全球范围的不是很好的适合一些异常处理情况下,如异常从消息处理程序,在没有行动或控制器的上下文存在。如果我们想要使用所筛选的异常处理提供灵活的范围,我们仍然需要异常筛选器。但如果我们需要处理异常控制器上下文之外,我们还需要一个单独的构造全全局错误处理 (东西没有控制器上下文和操作上下文约束)。
何时使用
- 异常的记录器是见到所有未处理的异常被 Web API 的解决方案。
- 异常处理程序是用于自定义所有可能响应未处理的异常被 Web API 的解决方案。
- 异常筛选器是最简单的解决方案,针对有关的具体行动或控制器子集未处理的异常处理。
服务详细信息
异常日志记录器和处理程序服务接口是简单的异步方法以各自的具体情况 ︰
public interface IExceptionLogger
{
Task LogAsync(ExceptionLoggerContext context,
CancellationToken cancellationToken);
} public interface IExceptionHandler
{
Task HandleAsync(ExceptionHandlerContext context,
CancellationToken cancellationToken);
}
我们也为这两种接口提供基类,这些类。重写核心 (同步或异步) 方法是登录或在推荐处理所需的全部时间。日志记录, ExceptionLogger基类将确保核心测井方法只一次呼吁每个例外 (即使它后来传播进一步向上调用堆栈和再次抓住)。ExceptionHandler 基类将调用核心处理方法仅用于顶部的调用堆栈,忽略遗留的嵌套的 catch 块的异常情况。(下面附录中的这些基类简化的版本)。
IExceptionLogger 和IExceptionHandler 收到异常有关的信息通过ExceptionContext.
public class ExceptionContext
{
public Exception Exception { get; set; } public HttpRequestMessage Request { get; set; } public HttpRequestContext RequestContext { get; set; } public HttpControllerContext ControllerContext { get; set; } public HttpActionContext ActionContext { get; set; } public HttpResponseMessage Response { get; set; } public string CatchBlock { get; set; } public bool IsTopLevelCatchBlock { get; set; }
}
7.2WebApi2中的全局异常处理的更多相关文章
- SpringBoot中的全局异常处理
SpringBoot中的全局异常处理 本篇要点 介绍SpringBoot默认的异常处理机制. 如何定义错误页面. 如何自定义异常数据. 如何自定义视图解析. 介绍@ControllerAdvice注解 ...
- 在.NET Core程序中设置全局异常处理
以前我们想设置全局异常处理只需要这样的代码: AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledExc ...
- Global Error Handling in ASP.NET Web API 2(webapi2 中的全局异常处理)
目前,在Web API中没有简单的方法来记录或处理全局异常(webapi1中).一些未处理的异常可以通过exception filters进行处理,但是有许多情况exception filters无法 ...
- WEB 项目中的全局异常处理
在web 项目中,遇到异常一般有两种处理方式:try.....catch....:throw 通常情况下我们用try.....catch.... 对异常进行捕捉处理,可是在实际项目中随时的进行异常捕捉 ...
- 【5min+】AspNet Core中的全局异常处理
系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...
- ASP.NET Core MVC 中设置全局异常处理方式
在asp.net core mvc中,如果有未处理的异常发生后,会返回http500错误,对于最终用户来说,显然不是特别友好.那如何对于这些未处理的异常显示统一的错误提示页面呢? 在asp.net c ...
- Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理
在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...
- UWP 中的全局异常处理
问题 在开发一款应用的过程中,我们开发者很难考虑到所有问题,往往会忘记处理一些可能发生的异常.随之而来的结果就是用户使用过程中接连不断的崩溃.所以,我们有必要处理所有未被我们处理的异常. 本文介绍了 ...
- MVC 全局异常处理及禁用显示头
MVC网站的global.asax中的Application_Start方法里,有这样一段代码: public class MvcApplication : System.Web.HttpApplic ...
随机推荐
- NYOJ 478
月老的烦恼(1) 描述 月老最近遇到了一个很棘手的问题,就是“剩男”“剩女”急速增长,而自己这边又人手不足导致天天都得加班.现在需要你来帮助月老解决这个问题,牵红绳的规则很简单:每个男生都一个编号n( ...
- AR(增强现实) 知识篇
增强现实(Augmented Reality,简称AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动.这种技术估计由1990年 ...
- bzoj[1087][SCOI2005]互不侵犯King
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- PAT 1037. 在霍格沃茨找零钱(20)
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.& ...
- js 检测页面刷新或关闭
window.onbeforeunload=function(){ //要提交的内容 return "随意写";//必须有return ,不然只有ie有效,chrome无效 }
- cxf3.x +spring 3.x(4.x)+ maven 发布webservice 服务
cxf 在做企业级webservices 服务的时候确实非常好用,个人觉得比axis1, 2都好用. 虽然spring自身也提供了webservices发布方法,这里使用cxf跟spring结合,使用 ...
- 处理 pcap 中的 mac 二进制字节流为可读格式
import struct # 利用 struct 处理字节流中的mac地址 适用于小端地址操作系统 def mac2str(bi_mac): mac = "" for i in ...
- linux进阶1
1.linux命令 1.1.find功能:在linux文件系统中,用来查找一个文件放在哪里了.举例:find /etc -name "interfaces"总结:(1)什么时候用f ...
- 编译安装apache
1.安装依赖库:“Development Tools” “Server Platform Development” pcre-devel 2.安装apr,apr-util 从yum源安装或去ap ...
- [转]Struts2理解--动态方法和method属性及通配符_默认Action
众所周知,默认条件下,在浏览器输入indexAction!execute.action,便会执行indexAction类里的execute方法,这样虽然方便,但可能带来安全隐患,通过url可以执行Ac ...