过滤器有什么作用,在什么场景下适合用到它?
假设一个项目进展到快结束的时候,项目leader为了保证程序的稳定性和可监控和维护性要求将所有的方法加上日志,如果项目比较庞大,方法非常多,那岂不是得费很大得劲来完成这样一件事情。不过不用担心,咋们遇到的问题,伟大的语言设计者早已帮我们想好了解决办法过滤器,过滤器是一种AOP(面向切面编程)技术的体现,AOP具有松耦合,易扩展,代码可复用的特点。
通常我们在这些场景下如身份验证、日志记录、异常获取等会使用到过滤器
.NET Core中的过滤器生命周期:
.NET Core中的过滤器有多种,先介绍ActionFilterAttribute的用法
(1)自定义一个Filter类:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
namespace Test.WebApi.Filter
{
public class ClientIpCheckActionFilter : ActionFilterAttribute
{
private readonly string _safelist;
public ClientIpCheckActionFilter(string safelist)
{
_safelist = safelist;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var remoteIp = context.HttpContext.Connection.RemoteIpAddress;
LogHelper.Debug("Remote IpAddress: {"+ remoteIp + "}");
var ip = _safelist.Split(';');
var badIp = true;
if (remoteIp.IsIPv4MappedToIPv6)
{
remoteIp = remoteIp.MapToIPv4();
}
foreach (var address in ip)
{
var testIp = IPAddress.Parse(address);
if (testIp.Equals(remoteIp))
{
badIp = false;
break;
}
}
if (badIp)
{
LogHelper.Debug("Forbidden Request from IP: {"+ remoteIp + "}");
context.Result = new StatusCodeResult(StatusCodes.Status403Forbidden);
return;
}
base.OnActionExecuting(context);
}
}
}
(2)注册过滤器,注册过滤器有两种方式,一种是全局注册,另一种是局部注册:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
// If using Kestrel:
//services.Configure<KestrelServerOptions>(options =>
//{
// options.AllowSynchronousIO = true;
//});
// If using IIS:
services.Configure<IISServerOptions>(options =>
{
options.AllowSynchronousIO = true;
});
// 全局注册 在ConfigureServices 添加
services.AddMvc(option => { option.Filters.Add(typeof(ClientIpCheckActionFilter)); });
}
局部注册,局部注册可以体现在类或方法上:
//[Route("api/[controller]")]
//[ApiController]
[ClientIpCheckFilter]
public class ContractController : ControllerBase
{
public IConfiguration Configuration { get; }
public ContractController(IConfiguration _configuration)
{
Configuration = _configuration;
}
// GET: api/<SendContractController>
[HttpGet]
[ClientIpCheckFilter]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
参考:文章来源:https://www.toymoban.com/news/detail-449502.html
.NET Core中过滤器Filter的使用介绍 - 星火卓越 - 博客园过滤器有什么作用,在什么场景下适合用到它? 假设一个项目进展到快结束的时候,项目leader为了保证程序的稳定性和可监控和维护性要求将所有的方法加上日志,如果项目比较庞大,方法非常多,那岂不是得费很大https://www.cnblogs.com/amylis_chen/p/12318081.html文章来源地址https://www.toymoban.com/news/detail-449502.html
到了这里,关于.Net Core WebApi 系列:过滤器Filter的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!