示例
将[TypeFilter(typeof(PersonsAlwaysRunResultFilter))]放到Controller级别
[Route("[controller]")]
[TypeFilter(typeof(ResponseHeaderActionFilter), Arguments = new object[] {
"X-Custom-Key-Controller", "Custom-Value-Controller", 3 }, Order = 3)]
[TypeFilter(typeof(HandleExceptionFilter))]
[TypeFilter(typeof(PersonsAlwaysRunResultFilter))]
public class PersonsController : Controller
如何让Index不使用PersonsAlwaysRunResultFilter?
Filters文件夹下新建SkipFilter.cs
using Microsoft.AspNetCore.Mvc.Filters;
namespace CRUDExample.Filters
{
public class SkipFilter : Attribute, IFilterMetadata
{
}
}
SkipFilter Attribute应用到Index
[Route("[action]")]
[Route("/")]
[TypeFilter(typeof(PersonsListActionFilter), Order = 4)]
[TypeFilter(typeof(ResponseHeaderActionFilter), Arguments = new object[] {
"X-Custom-Key-Action", "Custom-Value-Action", 1 }, Order = 1)]
[TypeFilter(typeof(PersonsListResultFilter))]
[SkipFilter]
public async Task<IActionResult> Index(string searchBy, string? searchString,
string sortBy = nameof(PersonResponse.PersonName),
SortOrderOptions sortOrder = SortOrderOptions.ASC)
PersonsAlwaysRunResultFilter.cs改造成如下
using Microsoft.AspNetCore.Mvc.Filters;
namespace CRUDExample.Filters.ResultFilters
{
public class PersonsAlwaysRunResultFilter : IAsyncAlwaysRunResultFilter
{
private readonly ILogger<PersonsAlwaysRunResultFilter> _logger;
public
PersonsAlwaysRunResultFilter(ILogger<PersonsAlwaysRunResultFilter> logger)
{
_logger = logger;
}
public async Task OnResultExecutionAsync(ResultExecutingContext context,
ResultExecutionDelegate next)
{
if (context.Filters.OfType<SkipFilter>().Any())
{
await next();
}
else
{
_logger.LogInformation("{FilterName}.{Method} before",
nameof(PersonsAlwaysRunResultFilter), nameof(OnResultExecutionAsync));
await next();
_logger.LogInformation("{FilterName}.{Method} after",
nameof(PersonsAlwaysRunResultFilter), nameof(OnResultExecutionAsync));
}
}
}
}
运行程序后,查看日志或者断点调试看到Index执行过程确实没有PersonsAlwaysRunResultFilter参与了。
Gitee获取源码: