1.继承ExceptionFilterAttribute类,重写OnException方法

 public class WebApiExceptionFilterAttribute : ExceptionFilterAttribute
{
//重写基类的异常处理方法
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
//业务异常处理
if (actionExecutedContext.Exception is BusinessException)
{
var businessException = (BusinessException)actionExecutedContext.Exception;
//自定义业务异常编码
int businessExceptionCode = businessException.ErrorMessage.Code;
//业务异常消息
string businessExceptionMsg = businessException.Message;
//异常消息Json串
var err = new { errcode = businessExceptionCode, errmsg = businessExceptionMsg };
string errMsg = JsonConvert.SerializeObject(err); //系统异常码
var oResponse = new HttpResponseMessage(HttpStatusCode.InternalServerError);
oResponse.Content = new StringContent(" ");
oResponse.Headers.Add("errMsg", errMsg);
actionExecutedContext.Response = oResponse;
}
else
{
actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
//异常消息Json串
var err = new { errcode = CommonErrorCode.ServiceError, errmsg = actionExecutedContext.Exception.Message };
string errMsg = JsonConvert.SerializeObject(err); //系统异常码
var oResponse = new HttpResponseMessage(HttpStatusCode.InternalServerError);
oResponse.Content = new StringContent(" ");
oResponse.Headers.Add("errMsg", errMsg);
actionExecutedContext.Response = oResponse;
} base.OnException(actionExecutedContext);
}
}

 2. Global.asax中,Application_Start方法中添加过滤器

protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
GlobalConfiguration.Configuration.Filters.Add(new WebApiExceptionFilterAttribute());
}

 3.例子:

控制器:

public class TestController : ApiController
{
[HttpGet]
public string GetTest1()
{ return "value1";
} [HttpGet]
public string GetTest2()
{
throw new BusinessException(123456,"业务异常");
} [HttpGet]
public string GetTest3()
{
throw new Exception("系统异常");
}
}

 结果:

提升:

为了满足每个webapi项目都应用自定义异常,把异常类封装到程序集中使用

1.结构:

问题:YesWay.WebAPI异常抛出类库添加引用需与webapI项目用的引用需相同,

之前的这些我都是在引用管理器,程序集中一个个找的,添加的,出现进不了OnException方法的问题,用nuget添加的就好了,可能是版本不一样吧

具体有这些东东:(他们之间有依赖,不需要一个个加,加一个可能会出来好几个...)

webapi需要引用的包:
Microsoft.AspNet.WebApi
Microsoft.AspNet.WebApi.Client
Microsoft.AspNet.WebApi.Client.zh-Hans
Microsoft.AspNet.WebApi.Core
Microsoft.AspNet.WebApi.Core.zh-Hans
Microsoft.AspNet.WebApi.WebHost
Microsoft.AspNet.WebApi.WebHost.zh-Hans
Microsoft.CodeDom.Providers.DotNetCompilerPlat
Microsoft.Net.Compilers
Newtonsoft.Json

2.webapi项目引用程序集

3.可以在控制器,控制器方法加特性使用

global中加这句,所有的控制器就都加上了
 
 

WebApi 异常处理解决方案的更多相关文章

  1. C#进阶系列——WebApi 异常处理解决方案

    前言:上篇C#进阶系列——WebApi接口传参不再困惑:传参详解介绍了WebApi参数的传递,这篇来看看WebApi里面异常的处理.关于异常处理,作为程序员的我们肯定不陌生,记得在介绍 AOP 的时候 ...

  2. C#进阶系列——WebApi 异常处理解决方案(转)

    出处:http://www.cnblogs.com/landeanfen/p/5363846.html 阅读目录 一.使用异常筛选器捕获所有异常 二.HttpResponseException自定义异 ...

  3. (转)C# WebApi 异常处理解决方案

    原文地址:http://www.cnblogs.com/landeanfen/p/5363846.html 一.使用异常筛选器捕获所有异常 我们知道,一般情况下,WebApi作为服务使用,每次客户端发 ...

  4. Asp.net WebApi 异常处理解决方案

    一.使用异常筛选器捕获所有异常 我们知道,一般情况下,WebApi作为服务使用,每次客户端发送http请求到我们的WebApi服务里面,服务端得到结果输出response到客户端.这个过程中,一旦服务 ...

  5. C#进阶系列——WebApi异常处理解决方案

    阅读目录 一.使用异常筛选器捕获所有异常 二.HttpResponseException自定义异常信息 三.返回HttpError 四.总结 正文 为什么说是实践?因为在http://www.asp. ...

  6. WebApi异常处理解决方案

    一.使用异常筛选器捕获所有异常 首先在App_Start里面新建一个类WebApiExceptionFilterAttribute.cs,继承ExceptionFilterAttribute,重写On ...

  7. C#进阶--WebApi异常处理机制

    其实对于C#异常处理大家都不陌生,但是对于在WeiApi上的异常处理实际上也和传统异常处理区别不大,但是却经过封装可以让异常更加友好,https://docs.microsoft.com/en-us/ ...

  8. webapi框架搭建-webapi异常处理

    webapi框架搭建系列博客 前言 上一篇我们已经完成了项目的日志管理,在项目开发中日志会经常记录程序中的异常,供后续问题排查使用.本篇讲如何在webapi里加入异常处理机制. 目的和原则 1.程序任 ...

  9. mvc和webapi同一解决方案调试办法

    今天在研究WebApi的时候,用mvc端直接请求webapi接口,发现怎么也请求不了,自己搞了半天,猜测可能是webapi没有完全启动吧,解决办法是将解决方案属性改为多启动项目,具体方法如下: 直接运 ...

随机推荐

  1. 【恢复,1】 redo 日志恢复的各种情况

    Recovering After the Loss of Online Redo Log Files If a media failure has affected the online redo l ...

  2. Python OS 文件

    Python OS 文件: 1 os.access(path, mode) 检验权限模式 2 os.chdir(path) 改变当前工作目录 3 os.chflags(path, flags) 设置路 ...

  3. LaunchScreen.storyboard 设置图片后不显示(转)

    LaunchScreen.storyboard 设置图片后不显示 将图片放在根目录下即可 3D85E99F-A79B-4419-817D-1417E1446624.png   转至:http://ww ...

  4. XHTML学习书籍

    http://baike.baidu.com/view/15906.htm   XHTML学习书籍 可扩展超文本置标语言(eXtensible HyperText Markup Language,XH ...

  5. SIFT 、Hog 、LBP 了解

    SIFT.HOG.LBP,这三者都属于局部特征. 一.三者原理上的区别 1.SIFT:Scale-Invariant Feature Taransform,尺度不变特征变换. 尺度空间的极值检测:搜索 ...

  6. 使用 SSHFS 挂载远程的 Linux 文件系统及目录

    1. 安装 sudo apt-get install sshfs 2. 创建 SSHFS 挂载目录 sudo mkdir /mnt/cong 3.使用 SSHFS 挂载远程的文件系统 sudo ssh ...

  7. appium 1.6.3 + ios 10.2 + xcode 8.2.1 真机运行safari

    启动appium 命令: appium --address "127.0.0.1" --session-override --pre-launch --debug-log-spac ...

  8. django 官方文档下载

    今天发现自己的django文档有点过时了,于是想去下载一份新,找了老半天才找到pdf的下载地址:于是把它记录下来,希望以后可以直接用. 一.进行django官方网站: 二.文档的pdf文件就在docu ...

  9. 将SVM用于多类分类

    转自:http://www.lining0806.com/%E5%B0%86svm%E7%94%A8%E4%BA%8E%E5%A4%9A%E7%B1%BB%E5%88%86%E7%B1%BB/ SVM ...

  10. jvm默认垃圾收集器

    jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代) jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel ...