前几天在webapi项目中遇到一个问题:Controller构造函数中抛出异常时全局过滤器捕获不到,于是网搜一把写下这篇博客作为总结。
HttpResponseException
通常在WebAPI的Controller中抛出的未处理异常,会以500的形式返回到客户端。而HttpResponseException
会返回我们指定的状态码,如返回501:
public HttpResponseMessage Exception()
{
//直接在Action中抛出HttpResponseException类型异常
throw new HttpResponseException(HttpStatusCode.NotImplemented);
}
在抛出HttpResponseException
时,可将HttpResponseMessage类型的实例作为参数以提供给客户端更多的信息。
HttpError
public HttpResponseMessage Exception()
{
//使用Request对象创建返回到客户端的错误信息
Request.CreateErrorResponse()
}
CreateErrorResponse
方法是HttpResponseMessage
类型的可扩展方法,该方法最终会调用扩展方法CreateResponse
返回一个HttpResponseMessage
类型的对象(ASP.NET WebAPI中Action的返回值最终都会被转换为HttpResponseMessage类型的对象),该对象包含一个HttpError
类型实例。
Exception Filters
自定义派生自ExceptionFilterAttribute或IExceptionFilter的异常处理类用于异常的处理。
过滤器可分为三个级别:
- Action
- Controller
- Global
注意:ASP.NET MVC和ASP.NET WebAPI的异常过滤器不可混用
ExceptionHandler
以下情形中的异常,过滤器是无法捕获到的:
Controller构造函数中抛出的异常
消息处理器中抛出的异常
路由过程中出现的异常
其它过滤器中抛出的异常
序列化返回内容时抛出的异常
解决方案如下:
自定义异常处理器,两种方式
public class XfhExceptionHandler : ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
context.Result = new ResponseMessageResult(
context.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "发生了不可描述的错误!")
);
//new InternalServerErrorResult(context.Request);
}
}
替换ASP.NET WebAPI默认的异常处理器
public static void Register(HttpConfiguration config)
{
config.Services.Replace(typeof(IExceptionHandler), new XfhExceptionHandler());
}
PS:若要记录未处理异常日志可实现接口IExceptionLogger或继承ExceptionLogger
小结
IExceptionFilter只能处理Action中发生的未处理异常,IExceptionHandler可以处理任何地方发生的未处理异常。
相关阅读
catch all unhandled exceptions in ASP.NET Web Api
Handling Errors in Web API Using Exception Filters and Exception Handlers
Exception Handling in ASP.NET Web API
Global Error Handling in ASP.NET Web API 2
Action Results in Web API 2
ASP.NET Web API 2中的错误处理的更多相关文章
-
ASP.NET Web API 2 中的属性路由使用(转载)
转载地址:ASP.NET Web API 2 中的属性路由使用
-
[翻译]ASP.NET Web API 2 中的全局错误处理
目录 已存在的选项 解决方案预览 设计原则 什么时候去用 方案详情 示例 附录: 基类详情 原文链接 Global Error Handling in ASP.NET Web API 2 由于翻译水平 ...
-
在ASP.NET Web API 2中使用Owin OAuth 刷新令牌(示例代码)
在上篇文章介绍了Web Api中使用令牌进行授权的后端实现方法,基于WebApi2和OWIN OAuth实现了获取access token,使用token访问需授权的资源信息.本文将介绍在Web Ap ...
-
在ASP.NET Web API项目中使用Hangfire实现后台任务处理
当前项目中有这样一个需求:由前端用户的一个操作,需要触发到不同设备的消息推送.由于推送这个具体功能,我们采用了第三方的服务.而这个服务调用有时候可能会有延时,为此,我们希望将消息推送与用户前端操作实现 ...
-
ASP.NET Web API 2 中的特性路由
ASP.NET MVC 5.1 开始已经支持基于特性的路由(http://attributerouting.net),ASP.NET WEB API 2 同时也支持了这一特性. 启用特性路 由只需要在 ...
-
asp.net web api 向客户端返回错误信息
1使用Http状态码 ASP.NET Web Api框架提供了Http状态码的值,如下图所示. 虽然有这些预定义的状态码,但在实际项目中使用自定状态码结合预定义状态码更有优势. 通过在适当的位置抛出异 ...
-
在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证
基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份 ...
-
swaggerui在asp.net web api core 中的应用
Swaggerui 可以为我们的webapi提供美观的在线文档,如下图: 实现步骤: NuGet Packages Install-Package Swashbuckle.AspNetCore 在s ...
-
【swaggerui】swaggerui在asp.net web api core 中的应用
Swaggerui 可以为我们的webapi提供美观的在线文档,如下图: 实现步骤: NuGet Packages Install-Package Swashbuckle.AspNetCore 在s ...
随机推荐
-
static与并发
在java中static用来修饰Class类中属性和方法. 被static修饰的成员属性和成员方法独立于该类的任何对象,它们在内存空间上会被放在描述Class的位置中,也就是说它们为此类(Class) ...
-
kvc(键-值编码)
kvc(键-值编码) { NSString *_name; Author *_author; NSArray *_kvcArray; float price;} //kvc,setValue 的设的值 ...
-
Animation用法
测试代码及说明: <!DOCTYPE html> <html lang="en-US"> <head> <meta charset=&qu ...
-
(六)学习MVC之标签a提交页面
标签<a>如何做到与<input type="submit"/>一样有提交页面信息的效果? @using (Html.BeginForm("Log ...
-
Android利用setLayoutParams在代码中调整布局(Margin和居中)
我们平常可以直接在xml里设置margin,如: <ImageView android:layout_margin="5dip" android:src="@dra ...
-
android R 文件生成不了
在android中比较头疼的是R文件生成不了.今天总结一下R文件生成不了的一些原因和解决方法 1. xml文件有错, 如果在res文件中的xml文件有错,android不会自动生成R文件,此时仔细查看 ...
-
sql server实现主从复制
测试环境 :主机: 数据库sql server08 r2 系统windows server 2008 r2 IP192.168.1.202 丛机:数据库sql server12 系统window ...
-
CentOS 6.2 中文
在虚拟机里面安装好centos6.2之后,默认是英文! 对于命令行操作无所谓啦,但是如果想看界面,就不是很适应! 修改方法如下: 1.用root登录系统,密码为创建虚拟机时候的密码.创建虚 ...
-
tensorflow/threading 用到的一些函数
---恢复内容开始--- import tensorflow as tf 1 tf.squeeze([1,2,3,4]) 删除所有为1的维度 eg shape从(1,2,3,1)到(2,3 ...
-
leetcode - [2]Evaluate Reverse Polish Notation
Evaluate Reverse Polish Notation Total Accepted: 24595 Total Submissions: 123794My Submissions Evalu ...