Asp.net Web Api开发(第三篇)自定义异常过滤器

来源:互联网 发布:知乎手机最好的变声器 编辑:程序博客网 时间:2024/06/05 05:27

如果不自定义异常过滤器,客户端调用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上面:

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);        }    }}
最后,在Global.asax中注册我们得自定义异常过滤器:

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());        }    }}

0 0
原创粉丝点击