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中加這句,所有的控制器就都加上了
