Asp.net Web Api開發(第三篇)自定義異常過濾器
阿新 • • 發佈:2019-01-30
如果不自定義異常過濾器,客戶端呼叫API出現錯誤時,將只能得到一個500之類的錯誤狀態,以及一句:出現錯誤。而服務端卻無法攔截到任何異常程式碼,當然你也可以在所有Action裡面寫try-catch來捕獲處理。但這不是我想要的,我們可以自定義一個異常過濾器來捕獲單個Action或整個Controller裡面的所有Action的異常。
上程式碼:
using System.Net; using System.Net.Http; using System.Web.Http.Filters; using RRP.Models.Response; namespace RRPService.WebApi.Comm { /// <summary> /// 異常處理過濾器 /// </summary> public class DExceptionFilterAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext context) { //可以記錄一些日誌 string fLog = context.Exception.ToString(); //篡改Response context.Response = new HttpResponseMessage(HttpStatusCode.OK); context.Response.Content = new StringContent(Dimoo.Lib.DataPack.JSerialize(new BaseResult() { success = 0, msg = "處理異常" })); } } }
然後,我們再把這個特性標記到所有Controller上或單個Action上面:
最後,在Global.asax中註冊我們得自定義異常過濾器:using System.Linq; using System.Web.Http; namespace RRPService.WebApi.App.Controllers { [DExceptionFilter] public class CompanyController : ApiController { [HttpPost] [Route("api/1110")] public RRP.Company.Models.Response.C3000O Login(RRP.Company.Models.Request.C3000I aIn) { return RRP.Company.BLL.C3000(aIn); } [DExceptionFilter] [HttpPost] [Route("api/1110")] public RRP.Company.Models.Response.C3001O Login2(RRP.Company.Models.Request.C3001I aIn) { return RRP.Company.BLL.C3001(aIn); } } }
using RRPService.WebApi.Comm; using System.Web.Http; using System.Web.Mvc; namespace RRPService.WebApi.App { /// <summary> /// web api 服務 /// </summary> public class WebApiApplication : System.Web.HttpApplication { /// <summary> /// 服務啟動 /// </summary> protected void Application_Start() { GlobalConfiguration.Configure(WebApiConfig.Register); GlobalConfiguration.Configuration.Filters.Add(new DExceptionFilterAttribute());//<<<<------------------重點 //Json序列化庫替換 HttpConfiguration fConfig = GlobalConfiguration.Configuration; fConfig.Formatters.Remove(fConfig.Formatters.JsonFormatter); fConfig.Formatters.Remove(fConfig.Formatters.XmlFormatter); fConfig.Formatters.Insert(0, new JilFormatter()); } } }