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}");
}
}
}