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

2021-03-17 01:24

阅读:831

YPE html>

标签:and   viewport   href   ilo   body   http   provider   name   net   

.net core 异常过滤器的使用

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

第二种方式(TypeFilter)

第三种方式(ServiceFilter)

第四种方式(IFilterFactory)

  CustomExceptionFilterAttribute.cs

技术图片
  public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
    {
        private readonly ILogger _logger;
        private readonly IModelMetadataProvider _modelMetadataProvider;
        public CustomExceptionFilterAttribute(ILogger logger, IModelMetadataProvider modelMetadataProvider)
        {
            _logger = logger;
            _modelMetadataProvider = modelMetadataProvider;
        }
        /// 
        /// 发生异常时 进入
        /// 
        /// 
        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

技术图片
错误

错误。

处理你的请求时出错。

异常信息:@ViewData["Exception"]

@{ Console.WriteLine(ViewData["Exception"]); }
技术图片

 

Ajax请求:

技术图片
@{
    ViewData["Title"] = "Home Page";
}

Welcome

Learn about building Web apps with ASP.NET Core.

@section scripts{ }
技术图片

 

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

技术图片
   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(); //注册
            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(); //注册
          services.AddControllersWithViews();
      }
技术图片

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

标签:and   viewport   href   ilo   body   http   provider   name   net   

原文地址:https://www.cnblogs.com/xbzhu/p/13056363.html


评论


亲,登录后才可以留言!