现在在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. oracle 密码有效期

    oracle的密码是存在有效期的,有时候会遇到密码到期需要重设的情况,查看当前密码有效期的语句: SELECT * FROM dba_profiles s WHERE s.profile='DEFAU ...

  2. ajax方法总结

    ajax方法总结 1.原生ajax get请求和post请求区别:黄色小三角 以get请求为例,输出结果如下: 2.jquery中的ajax 列了常用的6个方法: 3.状态说明 readystate: ...

  3. 适配iOS10的哪些事 ---- 学习笔记八

    一. 上传了一个版本,为什么没有构建版本? 解:info.plist中的Bundle version 与上一个版本一致或少于上一个版本,上线新版本时,Bundle version和Bundle ... ...

  4. LAMP.md

    LAMP Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越 ...

  5. git没有changId解决方法

    1.git branch work(从最新节点建立分支,相当于将自己的修改备份到新的分支) 2.git reset --hard HEAD~10(强制回滚多个节点) 3.git status 如果显示 ...

  6. Qt——设计颜色编辑器

    Qt中有一些封装好的对话框,比如QMessageBox.QColorDialog等,用途很广,但缺点是样式难以改变,直接拿来用可能与我们自己的系统样式不搭配,显得很难看. 所以我在无聊的时候,就自己写 ...

  7. linux下,Python 多版本共存,及Pip,Easy_install 安装扩展包

    Python2与Python3共存 安装Python3后,建立ln,使用Python(Python2),Python3 来区分两个版本 使用sudo apt-get install python3-s ...

  8. 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  9. Nginx搭建https服务器

    HTTPS简介 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单来讲就是HTTP的安全版.即H ...

  10. Ubuntu 14 設定 遠端連線,讓別台電腦可以連線進來

    Ubuntu 14 需 disable 加密,方可 遠端連線 此台電腦 xxx@xxx-ThinkPad-T460p:~$ gsettings set org.gnome.Vino require-e ...