.net core3.1 Filter四种注入方式和异常过滤器

.net core 异常过滤器的使用

第一种使用方式(全局注册)

第二种方式(TypeFilter)

第三种方式(ServiceFilter)

第四种方式(IFilterFactory)

  CustomExceptionFilterAttribute.cs

复制代码
  public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
    {
        private readonly ILogger<CustomExceptionFilterAttribute> _logger;
        private readonly IModelMetadataProvider _modelMetadataProvider;
        public CustomExceptionFilterAttribute(ILogger<CustomExceptionFilterAttribute> logger, IModelMetadataProvider modelMetadataProvider)
        {
            _logger = logger;
            _modelMetadataProvider = modelMetadataProvider;
        }
        /// <summary>
        /// 发生异常时 进入
        /// </summary>
        /// <param name="context"></param>
        public override void OnException(ExceptionContext context)
        {
            this._logger.LogError($"在响应 {context.HttpContext.Request.Path} 时出现异常,信息:{context.Exception.Message}");

            if (!context.ExceptionHandled)        //异常未被处理
            {
                if (this.IsAjaxRequest(context.HttpContext.Request))//ajax请求
                {
                    context.Result = new JsonResult(new
                    {
                        Result = false,
                        Msg = "发生错误,请联系管理员",
                        DebugMessage = context.Exception.Message
                    });//中断式---请求到这里结束了,不再继续Action
                }
                else
                {
                    var result = new ViewResult { ViewName = "~/Views/Shared/Error.cshtml" };
                    result.ViewData = new ViewDataDictionary(_modelMetadataProvider,
                                                                context.ModelState);
                    result.ViewData.Add("Exception", context.Exception.Message);
                    context.Result = result;
                }
                context.ExceptionHandled = true;//异常已被处理
            }
        }

        private bool IsAjaxRequest(HttpRequest request)
        {
            string header = request.Headers["X-Requested-With"];
            return "XMLHttpRequest".Equals(header);
        }
    }
复制代码

  Error.cshtml

复制代码
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>错误</title>
</head>
<body>
    <hgroup>
        <h1>错误。</h1>
        <h2>处理你的请求时出错。</h2>
        <h3>异常信息:@ViewData["Exception"]</h3>
        @{ 

            Console.WriteLine(ViewData["Exception"]);
        }
    </hgroup>
</body>
</html>
复制代码

 

Ajax请求:

复制代码
@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
    <button id="b01" type="button">Change Content</button>
</div>
@section scripts{
    <script>
        $("#b01").click(function () {

            $.ajax({
                url: 'http://localhost:5177/Custom',//地址
                dataType: 'json',//数据类型
                type: 'Post',//类型
                timeout: 2000,//超时
                //请求成功
                success: function (data, status) {
                    console.log(data.result);
                    console.log(data.msg);
                    console.log(data.debugMessage);
                }
            });
        });
    </script>
}
复制代码

 

第一种使用方式(全局注册):

复制代码
   public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews(options =>
         {
              options.Filters.Add(typeof(CustomExceptionFilterAttribute)); //全局注册异常
          });
          services.AddControllersWithViews();
    }
复制代码

第二种方式(TypeFilter):

复制代码
[TypeFilter(typeof(CustomExceptionFilterAttribute))]
    public class CustomController : Controller
    {
        public IActionResult Index()
        {
            Console.WriteLine("Custom/Index");
            int i = 0;
            int k = 10;
            int j = k / i;  //这里会异常
            return View();
        }
    }
复制代码

第三种方式(ServiceFilter):

复制代码
[ServiceFilter(typeof(CustomExceptionFilterAttribute))]
    public class CustomController : Controller
    {
        public IActionResult Index()
        {
            Console.WriteLine("Custom/Index");
            int i = 0;
            int k = 10;
            int j = k / i;  //这里会异常
            return View();
        }
    }

     public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<CustomExceptionFilterAttribute>(); //注册
            services.AddControllersWithViews();
        }
复制代码

 第四种方式(IFilterFactory)

 

复制代码
 public class CustomIOCFilterFactoryAttribute : Attribute, IFilterFactory
    {
        Type _FilterType = null;
        public CustomIOCFilterFactoryAttribute(Type FilterType)
        {
            _FilterType = FilterType;
        }
        public bool IsReusable => true;

        public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
        {
            return (IFilterMetadata)serviceProvider.GetService(this._FilterType);
        }
    }


    [CustomIOCFilterFactoryAttribute(typeof(CustomExceptionFilterAttribute))]
    public class CustomController : Controller
    {
        public IActionResult Index()
        {
            Console.WriteLine("Custom/Index");
            int i = 0;
            int k = 10;
            int j = k / i;  //这里会异常
            return View();
        }
    }

  public void ConfigureServices(IServiceCollection services)
      {
          services.AddTransient<CustomExceptionFilterAttribute>(); //注册
          services.AddControllersWithViews();
      }
复制代码
posted @ 2020-06-06 20:48  小水皮  阅读(1060)  评论(1编辑  收藏  举报