.net core webapi教程-Filter全局注册、控制器注册如何排除某些Action方法使其不生效
在使用Filter时,如果使用全局注册或者控制器注册(.net core webapi教程-Filter的多种注册方法),对程序所有Action或控制器内所有Action都是生效的,如何排除某些Action不生效呢?
系统提供了AllowAnonymousAttribute特性,但是有部分可以直接使用,有部分没法直接使用,需要自己编写代码进行扩展支持,本文讲解如何自己编写代码解决。
IResourceFiter、IActionFilter、IResultFilter三个Filter不能直接使用,需要扩展支持。
一、创建CustomAllowAnonymousAttribute特性类并继承自Attribute
namespace NetCoreStudy.WebApi.Utility.Filters
{
public class CustomAllowAnonymousAttribute:Attribute
{
}
}
二、在Action方法标记特性使用特性
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using NetCoreStaty.BussinessInterface;
using NetCoreStudy.Model;
using NetCoreStudy.Utility;
using NetCoreStudy.WebApi.Utility.Filters;
namespace NetCoreStudy.WebApi.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
[ResourceFilter]
public class FilterController : ControllerBase
{
private readonly IBookService _bookService;
public FilterController(IBookService bookService) {
_bookService = bookService;
}
[HttpGet]
[CustomAllowAnonymous]
public IActionResult ResultIndex()
{
var list = _bookService.Query<BookEntity>(c => true).ToList();
return new JsonResult(new
{
Id = 123,
Name = "张三",
Age = 34
});
}
}
}
三、修改ResourceFilterAttribute代码支持CustomAllowAnonymousAttribute特性
CustomAllowAnonymousAttribute类自定义了一个特性,在ResourceFilterAttribute Filter实现类中获取Action上面是否标注了CustomAllowAnonymousAttribute特性,如果获取到说明方法有标记直接返回,代码如下:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace NetCoreStudy.WebApi.Utility.Filters
{
public class ResourceFilterAttribute : Attribute, IResourceFilter
{
private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
/// <summary>
/// 在XX资源之前
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuting(ResourceExecutingContext context)
{
//context.ActionDescriptor.EndpointMetadata获取包含标记在当前要访问的Action上或者当前Action所在控制器
//标记的所有的特性
if (context.ActionDescriptor.EndpointMetadata.Any(c=>c.GetType().Equals(typeof(CustomAllowAnonymousAttribute))))
{
return;
}
//如果支持匿名,就不让这里的代码执行
string key = context.HttpContext.Request.Path;
if (CacheDictionary.ContainsKey(key))
{
//只要给Reslut赋值了,就会中断往后执行,直接返回给调用方
context.Result = (IActionResult)CacheDictionary[key];
}
Console.WriteLine("在某某资源之前执行");
}
/// <summary>
/// 在XX资源之后
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuted(ResourceExecutedContext context)
{
//context.ActionDescriptor.EndpointMetadata获取包含标记在当前要访问的Action上或者当前Action所在控制器
//标记的所有的特性
if (context.ActionDescriptor.EndpointMetadata.Any(c => c.GetType().Equals(typeof(CustomAllowAnonymousAttribute))))
{
return;
}
//如果支持匿名,就不让这里的代码执行
//拿到执行结果,保存到缓存
string key = context.HttpContext.Request.Path;
CacheDictionary[key] = context.Result;
Console.WriteLine("在某某资源之后执行");
}
}
}
猜您可能还喜欢
- .net core webapi教程-Swagger请求参数设置默认值(1931)
- .net core webapi教程-设置返回Json格式与Model大小写一致(1380)
- .net core webapi教程-配置 Swagger 显示接口注释及描述信息(1287)
- .net core webapi教程-设置日期型字段返回Json格式(1268)
- .net core webapi教程-IActionFilter使用详解 (1202)
- .net core webapi教程-Filter全局注册、控制器注册如何排除某些Action方法使其不生效(1102)
- .net core webapi教程-Swagger请求参数通过属性特性设置默认值(1074)
- .net core webapi教程-IExceptionFilter、IAsyncExceptionFilter使用详解 (1004)
- .net core webapi教程-Filter的多种注册方法(965)
- .net core webapi教程-使用log4net写文本日志(926)
评论列表
发表评论
文章分类
文章归档
阅读排行
- 1. Windows Server 2008 R2永久激活及Chew-WGA v0.9下载(13317)
- 2.Visual Studio 2017中安装visualSVN及使用详解(5232)
- 3.完美解决iis下JWplayer提示Error loading media: File could not be played错误(4069)
- 4.asp.net mvc+jquery easyui开发基础(一)模块首页及增加、修改、删除模块实现(3421)
- 5.Android avax.net.ssl.SSLPeerUnverifiedException: No peer certificate 解决方法(httpClient支持HTTPS的访问方式)(3268)
- 6..Net Mvc中使用Jquery EasyUI控件讲解(一)表格控件datagrid使用介绍(3016)
- 7.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(三)登录模块开发(2911)
- 8.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(七)权限管理模块之系统菜单动态生成(2909)
- 9.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(八)权限管理模块之权限管理实现(2516)
- 10. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(六)权限管理模块之初始数据准备(2490)
