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. 编程算法 - 翻转单词顺序 代码(C)

    翻转单词顺序 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个英文句子, 翻转句子中单词的顺序, 但单词内字符的顺序不变. 首先翻转(r ...

  2. 【apache2】apache2查看错误日志、请求日志

    1.一般存储路径在 [ /var/log/apache2/ ]下面, 2.错误日志和请求日志 必须要进行定期清理. 清理完成后,必须重启apache  [  cd /  ;  service apac ...

  3. 抛弃鼠标的神器——Vimium

    j: 向下细微滚动窗口.  k:向上细微滚动窗口.(默认的<c-e><c-y> 表示Ctrl+e,按住ctrl再按e,<c-y>同理.在此感谢[Gnat]   ht ...

  4. apache绑定多个域名

    在httpd.conf里, 1.把#NameVirtualHost *:80前的注释去掉2.ServerName 127.0.0.1 修改成ServerName 72.167.11.303.#Name ...

  5. js闭包的应用

    <ul id="ul1"> <li style="border:1px solid red;">1</li> <li ...

  6. 如何修改浏览器默认的alert样式?

    window.alert = function(str) { var shield = document.createElement("DIV"); shield.id = &qu ...

  7. FTPHelper-封装FTP的相关操作

    using System; using System.IO; using System.Net; using System.Text; namespace Whir.Software.DataSync ...

  8. mysqldump全量备份+mysqlbinlog二进制日志增量备份

    日常的数据备份及恢复测试,是DBA工作重中之重的事情,所以要做好备份及测试,日常的备份常见有mysqldump+binlog备份.xtrabackup+binlog备份,无论那一种,几乎都少不了对bi ...

  9. Ubuntu 文件文件夹查看权限和设置权限

    ubuntu下查看权限的命令为: ls -l filename ls -ld folder ubuntu下设置权限的命令为: 一共有10位数 其中: 最前面那个 - 代表的是类型 中间那三个 rw- ...

  10. oracle 显示格式化

    sqlplus中:set wrap off; set pagesize 1000; set linesize 1000; col id format A20; //该字段最长显示20个字符 col n ...