.NET WebAPI 利用特性捕捉异常

2018-06-27 10:04:49来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

声明:本方式及代码只使用与.NET Web API.

先创建类继承ExceptionFilterAttribute类型并复写OnException方法。

代码如下:

using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Web.Http.Filters;
using FrameWork.Common;
using FrameWork.Common.Const;

namespace FrameWork.Web.Handle
{
    /// <summary>
    /// 处理错误信息
    /// </summary>
    public class ErrorHandleAttribute : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext filterContext)
        {
            // 错误处理
            base.OnException(filterContext);
            var sb = new StringBuilder();
            sb.AppendLine("参数:"+ GetExceptionMessage(filterContext));
            sb.AppendLine("异常内容:"+ filterContext.Exception.ToJson());
            Log4NetHelp.Error(sb.ToString());
            filterContext.Response = GetResponse(sb.ToString());
        }

        /// <summary>
        /// 处理错误信息为方便开发人员阅读的格式,包括接口地址以及参数
        /// </summary>
        /// <param name="actionExecutedContext">异常内容</param>
        private string GetExceptionMessage(HttpActionExecutedContext actionExecutedContext)
        {
            var session = System.Web.HttpContext.Current.Session;
            var request = System.Web.HttpContext.Current.Request;
            var guid = Guid.NewGuid().ToString();
            var task = actionExecutedContext.ActionContext.Request.Content.ReadAsStreamAsync();
            var content = string.Empty;
            try
            {
                var sm = task.Result;
                if (sm != null)
                {
                    sm.Seek(0, SeekOrigin.Begin);
                    var len = (int)sm.Length;
                    var inputByts = new byte[len];
                    sm.Read(inputByts, 0, len);
                    sm.Close();
                    content = Encoding.UTF8.GetString(inputByts);
                    sm.Close();
                }
            }
            catch (Exception e)
            {
                return e.Message;
            }

            var sessionId = session == null ? "" : session.SessionID;
            var pars = string.Format("error:\r\n id = {3};\r\n sessionId = {0};\r\n url = {1};\r\n contentType = {4};\r\n content = {2};"
                , sessionId
                , request.RawUrl
                , content
                , guid
                , request.ContentType);

            return pars;
        }

        /// <summary>
        /// 处理错误信息后执行的方法
        /// </summary>
        /// <param name="mes">错误信息</param>
        private HttpResponseMessage GetResponse(string mes)
        {
            return JsonHelper.ToJson(new
            {
                Info = CommonConst.FailStr,
                Message = mes,
                Msg = false,
                ResultCode = CommonConst.FailCode
            });
        }
    }
}

如何使用呢?

只需要在需要捕捉异常的控制器加上[ErrorHandle]即可。

例如:

    [ErrorHandle]
    public abstract class AdminControllerBase : Controller
    {
          //代码逻辑
    }

如果继承AdminControllerBase或者带有[ErrorHandle]特性的类和方法出现了错误,都会执行OnException方法。

可以在处理异常的方法里面加上自己想要的逻辑处理。

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:5.WebAPI的Filter

下一篇:ASP.NET MVC Filters 4种默认过滤器的使用【附示例】