现在在WebApi中还没有一种简单的方式去记录或者处理全局的异常。一些未处理的异常可以处理通过异常过滤器,但有大量的异常是异常过滤器不能处理的。例如:

  1. 从控制器的构造函数引发的异常。
  2. 从消息处理程序引发的异常。
  3. 在路由过程中引发的异常。
  4. 在响应内容序列化期间引发的异常。

我们需要提供简单、 一致的方式来记录和处理 (如果可能) 这些异常。

处理异常有两种方式,其中一种我们可以发送一个错误响应;另外一种我们可以在那里记录日志异常,举个例子就是引发异常是在响应流的内容时,在这个时候处理就太晚了,因为这时响应码,标题和部分响应内容已经在传输上了,所以我们只是中断连接发送响应消息。即使不能处理该异常,我们仍能记录异常日志,在那里我们可以检测到错误的情况下,返回相应的错误响应,如下所示:

 public IHttpActionResult GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}

现有的选项

解决方案概述

我们提供两个用户可更换的服务, IExceptionLogger和 IExceptionHandler,来记录和处理未处理的异常。服务是很相似,但是也有两个主要区别 ︰

  1. 我们支持注册多个异常记录器,但只有一个单一的异常处理程序。
  2. 异常的记录器总是会调用,即使我们要中止连接。异常处理程序只会调用时我们仍然能够以选择要发送的响应消息。

这两种服务提供访问异常上下文包含异常检测到的点、 特别是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中的全局异常处理的更多相关文章

  1. SpringBoot中的全局异常处理

    SpringBoot中的全局异常处理 本篇要点 介绍SpringBoot默认的异常处理机制. 如何定义错误页面. 如何自定义异常数据. 如何自定义视图解析. 介绍@ControllerAdvice注解 ...

  2. 在.NET Core程序中设置全局异常处理

    以前我们想设置全局异常处理只需要这样的代码: AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledExc ...

  3. Global Error Handling in ASP.NET Web API 2(webapi2 中的全局异常处理)

    目前,在Web API中没有简单的方法来记录或处理全局异常(webapi1中).一些未处理的异常可以通过exception filters进行处理,但是有许多情况exception filters无法 ...

  4. WEB 项目中的全局异常处理

    在web 项目中,遇到异常一般有两种处理方式:try.....catch....:throw 通常情况下我们用try.....catch.... 对异常进行捕捉处理,可是在实际项目中随时的进行异常捕捉 ...

  5. 【5min+】AspNet Core中的全局异常处理

    系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...

  6. ASP.NET Core MVC 中设置全局异常处理方式

    在asp.net core mvc中,如果有未处理的异常发生后,会返回http500错误,对于最终用户来说,显然不是特别友好.那如何对于这些未处理的异常显示统一的错误提示页面呢? 在asp.net c ...

  7. Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理

    在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...

  8. UWP 中的全局异常处理

    问题 在开发一款应用的过程中,我们开发者很难考虑到所有问题,往往会忘记处理一些可能发生的异常.随之而来的结果就是用户使用过程中接连不断的崩溃.所以,我们有必要处理所有未被我们处理的异常. 本文介绍了 ...

  9. MVC 全局异常处理及禁用显示头

    MVC网站的global.asax中的Application_Start方法里,有这样一段代码: public class MvcApplication : System.Web.HttpApplic ...

随机推荐

  1. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 960  Solved: 5 ...

  2. 洛谷10月月赛Round.1| P3398 仓鼠找sugar[LCA]

    题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...

  3. quartz集群分布式(并发)部署解决方案-Spring

    项目中使用分布式并发部署定时任务,多台跨JVM,按照常理逻辑每个JVM的定时任务会各自运行,这样就会存在问题,多台分布式JVM机器的应用服务同时干活,一个是加重服务负担,另外一个是存在严重的逻辑问题, ...

  4. Dialog详解(包括进度条、PopupWindow、自定义view、自定义样式的对话框)

    Dialog详解(包括进度条.PopupWindow.自定义view.自定义样式的对话框)   Android中提供了多种对话框,在实际应用中我们可能会需要修改这些已有的对话框.本实例就是从实际出发, ...

  5. CSS水平居中/垂直居中的N个方法

    我看最近微博流行CSS居中技术,老外码农争相写相关的文章,一篇赛一篇的长啊,我把几篇归纳总结了一下,算是笔记. 孔乙己曾说:"茴香豆的回字有四种写法",万一哪天有个面试官问你:&q ...

  6. ZigZag Conversion leetcode java

    题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...

  7. 图片轮播图插件的使用 unslider!!!

    1.百度图片轮播图unslider,第一个就会出现jquery unslider轮播图,点击进去,下载网站提供的文件,解压,内部有我们需要使用的各种js,图片等. 2.在自己的eclipse或者int ...

  8. 在c#中使用指针

    如果想在c#中使用指针,首先对项目进行配置:在解决方案资源管理器中右击项目名选择属性(或在项目菜单中选择consoleApplication属性(consoleApplication为项名)),在生成 ...

  9. 解决:Win 10 + Mint 18双系统时间不同步,更换系统启动项顺序

    1.win10 & mint 18双系统时间同步: 先打开终端下更新一下时间,确保时间无误: sudo apt-get install ntpdate sudo ntpdate time.wi ...

  10. 表格不被内容撑大,且超出的内容变为省略号(css)

    今天写代码,发现表格会被内容撑大,影响到了网页的整体布局. 百度了一解决方法,下面是代码和我的备注 table{table-layout: fixed;}        //固定表格 table td ...