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

如果不自定义异常过滤器,客户端调用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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值