.NET Core 程序报错处理_执行Action前后事件_Action缓存_浏览器缓存

1、程序报错处理 ExceptionFilterAttribute
2、执行Action前后,执行事件 ActionFilterAttribute
3、Action缓存
4、浏览器缓存:ActionFilterAttribute(谷歌:刷新时依然请求后台,打开页面时,不会请求,与浏览器特性有关)

一、程序报错处理 ExceptionFilterAttribute

TryFilterFactory.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.Logging;

namespace WebApplication1.Models
{
    /// <summary>
    /// 基于完成Filter的依赖注入
    /// </summary>
    public class TryFilterFactory : Attribute, IFilterFactory
    {
        public bool IsReusable => true;

        public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
        {
            return (IFilterMetadata)serviceProvider.GetService(typeof(TryFilter));

        }
    }
    public class TryFilter : ExceptionFilterAttribute
    {
        private readonly ILogger<TryFilter> _logger;
        private readonly IModelMetadataProvider _modelMetadataProvider;

        public TryFilter(ILogger<TryFilter> logger, IModelMetadataProvider modelMetadataProvider)
        {
            _logger = logger;
            _modelMetadataProvider = modelMetadataProvider;
        }
        public override void OnException(ExceptionContext context)
        {
            //查看错误是否被处理
            if (!context.ExceptionHandled)
            {
                this._logger.LogError("");
                this._logger.LogError("*******************************************************************下******");
                this._logger.LogError($"URL: /{context.HttpContext.Request.RouteValues["controller"]}/{context.HttpContext.Request.RouteValues["action"]} ");
                this._logger.LogError($"错误:{context.Exception.Message}");
                this._logger.LogError("********************************************************************上******");
                this._logger.LogError("");


                if (this.IsAjaxRequest(context.HttpContext.Request))//header看看是不是XMLHttpRequest
                {
                    //返回错误
                    context.Result = new JsonResult(new
                    {
                        Result = false,
                        Msg = context.Exception.Message
                    });
                }
                else
                {
                    var result = new ViewResult { ViewName = "~/Views/Shared/Error.cshtml" };
                    result.ViewData = new ViewDataDictionary(_modelMetadataProvider, context.ModelState);
                    result.ViewData.Add("Exception", context.Exception);
                    result.ViewData.Add("Controller", context.HttpContext.Request.RouteValues["controller"]);
                    result.ViewData.Add("Action", context.HttpContext.Request.RouteValues["action"]);

                    context.Result = result;
                }
                //标记错误已经被处理
                context.ExceptionHandled = true;

            }
        }

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


}

使用方法:
a、针对Action

[TryFilterFactory]
        public IActionResult Index()
        {
            object aa = "11ad"; 
            int c = Convert.ToInt32(aa); 
            return View(aa);
        }

b、针对controller
在这里插入图片描述
c、针对全局
Startup.cs

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSession();
            services.AddControllersWithViews();

            services.AddControllersWithViews(options =>
            {
                options.Filters.Add<TryFilterFactory>(); //全局注册 
            }); 
            services.AddScoped(typeof(TryFilter)); 
        }

报错展示视图

@*@model ErrorViewModel*@ 
@{
    ViewData["Title"] = "Error";
    Exception exception = base.ViewData["Exception"] as Exception;
    string Controller = base.ViewData["Controller"]?.ToString();
    string Action = base.ViewData["Action"]?.ToString(); 
    
}

<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
<h2>@exception.Message</h2>
<h2>Controller: @Controller</h2>
<h2>Action: @Action</h2> 

二、执行Action前后,执行事件 ActionFilterAttribute

using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplication1.Models
{
    public class CustomActionFilterAttribute : ActionFilterAttribute
    {  
        public override void OnActionExecuted(ActionExecutedContext context)
        { 
            Console.WriteLine($"方法执行(前)执行");
        }
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            Console.WriteLine($"方法执行(后)执行");
        }
        public override void OnResultExecuting(ResultExecutingContext context)
        {
            Console.WriteLine($"This {nameof(CustomActionFilterAttribute)} OnResultExecuting{this.Order}");
        }
        public override void OnResultExecuted(ResultExecutedContext context)
        {
            Console.WriteLine($"This {nameof(CustomActionFilterAttribute)} OnResultExecuted{this.Order}");
        }
    }
}

使用方法:注解
在这里插入图片描述

三、Action缓存

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplication1.Models
{
    /// <summary>
    /// 
    /// </summary>
    public class CustomResourceFilterAttribute : Attribute, IResourceFilter, IFilterMetadata
    {
        private static Dictionary<string, IActionResult> CustomCache = new Dictionary<string, IActionResult>();
        /// <summary>
        /// 发生在其他动作之前
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuting(ResourceExecutingContext context)
        { 
            //if 有缓存,直接返回缓存
            string key = context.HttpContext.Request.Path;
            if (CustomCache.ContainsKey(key))
            {
                context.Result = CustomCache[key];//断路器--到Result生成了,但是Result还需要转换成Html
            }
        }
        /// <summary>
        /// 发生在其他动作之后
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        { 
            //这个应该缓存起来
            string key = context.HttpContext.Request.Path;
            if (!CustomCache.ContainsKey(key))
            {
                CustomCache.Add(key, context.Result);
            }
        }
    }
}

在这里插入图片描述

四、浏览器缓存:ActionFilterAttribute

context.HttpContext.Response.Headers.Add(“Cache-Control”, “public,max-age=6000”);

6000=100小时

using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplication1.Models
{
    public class CustomActionCacheFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext context)
        {
            context.HttpContext.Response.Headers.Add("Cache-Control", "public,max-age=6000");
            Console.WriteLine($"This {nameof(CustomActionCacheFilterAttribute)} OnActionExecuted{this.Order}");
        }
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            Console.WriteLine($"This {nameof(CustomActionCacheFilterAttribute)} OnActionExecuting{this.Order}");
        }
        public override void OnResultExecuting(ResultExecutingContext context)
        {
            Console.WriteLine($"This {nameof(CustomActionCacheFilterAttribute)} OnResultExecuting{this.Order}");
        }
        public override void OnResultExecuted(ResultExecutedContext context)
        {
            Console.WriteLine($"This {nameof(CustomActionCacheFilterAttribute)} OnResultExecuted{this.Order}");
        }
    }

}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值