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


    .net core 异常过滤器的使用

      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();
          }
  • 相关阅读:
    PS常用美化处理方法大全
    FastReport.Net使用:[32]对话框使用2
    FastReport.Net使用:[31]使用带参查询及存储
    FastReport.Net使用:[30]对话框使用
    FastReport.Net使用:[29]调用存储过程1
    FastReport.Net使用:[28]数据合并
    FastReport.Net使用:[27]样式使用
    FastReport.Net使用:[26]数字格式
    FastReport.Net使用:[25]除数0处理方法
    FastReport.Net使用:[24]其他控件(邮政编码(Zip Code),网格文本(Cellular Text)以及线性刻度尺(Linear Gauge))
  • 原文地址:https://www.cnblogs.com/wangdash/p/12448862.html
Copyright © 2020-2023  润新知