目录
三:IAsyncAlwaysRunResultFilter异步
一:说明
设置Context.Result结果后,程序不再继续执行,可以利用IAlwaysRunResultFilter或IAsyncAlwaysRunResultFilter特性让程序继续执行。
使用IAlwaysRunResultFilter特性搭配IResourceFilter或IResultFilter或IActionFilter效果会更好。
本案例搭配IResourceFilter特性。
未使用IAlwaysRunResultFilter同步过滤器执行顺序:
1:执行ResourceFilter.OnResourceExecuting方法
2:执行控制器中的构造函数,实例化控制器
3:执行具体的Action方法
4:执行ResourceFilter.OnResourceExecuted方法
5:缓存之后,只执行ResourceFilter.OnResourceExecuting方法,不再继续执行。
使用IAlwaysRunResultFilter同步过滤器执行顺序:
1:执行ResourceFilter.OnResourceExecuting方法
2:执行控制器中的构造函数,实例化控制器
3:执行具体的Action方法
4:执行AlwaysRunResultFilter.OnResultExecuting方法
5:执行AlwaysRunResultFilter.OnResultExecuted方法
6:执行ResourceFilter.OnResourceExecuted方法
7:缓存之后,继续执行AlwaysRunResultFilter.OnResultExecuting方法
8:继续执行AlwaysRunResultFilter.OnResultExecuted方法
未使用IAsyncAlwaysRunResultFilter异步过滤器执行顺序:
1:执行ResourceFilter.OnResourceExecuting方法
2:执行控制器中的构造函数,实例化控制器
3:执行具体的Action方法
4:执行ResourceFilter.OnResourceExecuted方法
5:缓存之后,只执行ResourceFilter.OnResourceExecuting方法,不再继续执行。
使用IAsyncAlwaysRunResultFilter异步过滤器执行顺序:
1:执行ResourceFilter.OnResourceExecuting方法
2:执行控制器中的构造函数,实例化控制器
3:执行具体的Action方法
4:执行AlwaysRunResultFilter.OnResultExecutionAsync方法
5:执行ResourceFilter.OnResourceExecuted方法
6:缓存之后,继续执行IAsyncAlwaysRunResultFilter.OnResultExecutionAsync方法
7:继续执行ResourceFilter.OnResourceExecuted方法
二:IAlwaysRunResultFilter同步
控制器代码:
/// <summary>
/// Get请求
/// 应用ResourceFilter扩展
/// 应用AlwaysRunResultFilter扩展
/// Home控制器的Index
/// </summary>
/// <returns>Index视图</returns>
[HttpGet]
[ResourceFilter]
[AlwaysRunResultFilter]
public IActionResult Index()
{
ViewBag.DateTime = DateTime.Now.ToString("HH:mm:ss");
return View();
}
视图代码:
@{
ViewData["Title"] = "Home Page";
}
<h2>来自于控制器的计算结果:@ViewBag.DateTime</h2>
<h2>来自于视图中的计算结果:@DateTime.Now.ToString("HH:mm:ss")</h2>
关键类ResourceFilter代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace Study_ASP.NET_Core_MVC.Utility.Filters
{
public class ResourceFilter : Attribute, IResourceFilter
{
/// <summary>
/// 初始化缓存构造函数
/// </summary>
private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
/// <summary>
/// 在XXX资源之前
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuting(ResourceExecutingContext context)
{
string pathKey = context.HttpContext.Request.Path;
if (CacheDictionary.ContainsKey(pathKey))
{
context.Result = (IActionResult)CacheDictionary[pathKey];
}
Console.WriteLine("CustomResourceFilterAttribute.OnResourceExecuting方法");
}
/// <summary>
/// 在XXX资源之后
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuted(ResourceExecutedContext context)
{
string pathKey = context.HttpContext.Request.Path;
CacheDictionary[pathKey] = context.Result;
Console.WriteLine("CustomResourceFilterAttribute.OnResourceExecuted方法");
}
}
}
关键类AlwaysRunResultFilter代码:
using Microsoft.AspNetCore.Mvc.Filters;
namespace Study_ASP.NET_Core_MVC.Utility.Filters
{
public class AlwaysRunResultFilter : Attribute, IAlwaysRunResultFilter
{
/// <summary>
/// 在XXX执行之前
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnResultExecuting(ResultExecutingContext context)
{
Console.WriteLine("在XXX执行之前AlwaysRunResultFilter.OnResultExecuting方法");
}
/// <summary>
/// 在XXX执行之后
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnResultExecuted(ResultExecutedContext context)
{
Console.WriteLine("在XXX执行之前AlwaysRunResultFilter.OnResultExecuted方法");
}
}
}
结果截图:
三:IAsyncAlwaysRunResultFilter异步
控制器代码:
/// <summary>
/// Get请求
/// 应用ResourceFilter扩展
/// 应用AlwaysRunResultAsyncFilter扩展
/// Home控制器的Index
/// </summary>
/// <returns>Index视图</returns>
[HttpGet]
[ResourceFilter]
[AlwaysRunResultAsyncFilter]
public IActionResult Index()
{
ViewBag.DateTime = DateTime.Now.ToString("HH:mm:ss");
return View();
}
视图代码:
@{
ViewData["Title"] = "Home Page";
}
<h2>来自于控制器的计算结果:@ViewBag.DateTime</h2>
<h2>来自于视图中的计算结果:@DateTime.Now.ToString("HH:mm:ss")</h2>
关键类ResourceFilter代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace Study_ASP.NET_Core_MVC.Utility.Filters
{
public class ResourceFilter : Attribute, IResourceFilter
{
/// <summary>
/// 初始化缓存构造函数
/// </summary>
private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
/// <summary>
/// 在XXX资源之前
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuting(ResourceExecutingContext context)
{
string pathKey = context.HttpContext.Request.Path;
if (CacheDictionary.ContainsKey(pathKey))
{
context.Result = (IActionResult)CacheDictionary[pathKey];
}
Console.WriteLine("CustomResourceFilterAttribute.OnResourceExecuting方法");
}
/// <summary>
/// 在XXX资源之后
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuted(ResourceExecutedContext context)
{
string pathKey = context.HttpContext.Request.Path;
CacheDictionary[pathKey] = context.Result;
Console.WriteLine("CustomResourceFilterAttribute.OnResourceExecuted方法");
}
}
}
关键类AlwaysRunResultAsyncFilter代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace Study_ASP.NET_Core_MVC.Utility.Filters
{
public class AlwaysRunResultAsyncFilter : Attribute, IAsyncAlwaysRunResultFilter
{
/// <summary>
/// 在XXX执行时
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
Console.WriteLine("在XXX执行之前AlwaysRunResultAsyncFilter.OnResultExecutionAsync方法");
await next.Invoke();
Console.WriteLine("在XXX执行之后AlwaysRunResultAsyncFilter.OnResultExecutionAsync方法");
}
}
}
结果截图: