GVKun编程网logo

asp.net – Sitecore:按字段选择项目:TreelistEx(aspnet单选按钮)

7

在这里,我们将给大家分享关于asp.net–Sitecore:按字段选择项目:TreelistEx的知识,让您更了解aspnet单选按钮的本质,同时也会涉及到如何更有效地.NetCore结合AspNe

在这里,我们将给大家分享关于asp.net – Sitecore:按字段选择项目:TreelistEx的知识,让您更了解aspnet单选按钮的本质,同时也会涉及到如何更有效地.Net Core 结合 AspNetCoreRateLimit 实现限流、ASP.NET 4.0 site displaying error - ISAPI “Restric、ASP.NET Core WebApi AspNetCoreRateLimit 限流中间件学习、Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现的内容。

本文目录一览:

asp.net – Sitecore:按字段选择项目:TreelistEx(aspnet单选按钮)

asp.net – Sitecore:按字段选择项目:TreelistEx(aspnet单选按钮)

我有一个名为MyItems的Sitecore文件夹,其中包含MyItem类型的项目.我需要使用sitecore查询或使用xpath从.net代码查询项目. MyItem的字段为MyField,类型为TreelistEx.我需要选择MyField包含’thevalue’的所有项目(guid of other item).我该怎么做?

非常感谢

解决方法

string query = string.Format("/sitecore/content/MyItems/*[contains(@MyField,'{0}')]",thevalue);
Item[] myItems = Sitecore.Context.Database.SelectItems(query);

我刚从我的网站上提取此代码并调整了查询​​的名称.如果你有很多MyItems,这是相当低效的,所以我不会在性能关键的页面上使用它.相同的查询应适用于任何列表类型字段.

.Net Core 结合 AspNetCoreRateLimit 实现限流

.Net Core 结合 AspNetCoreRateLimit 实现限流

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代

前言

  相信使用过 WebApiThrottle 的童鞋对 AspNetCoreRateLimit 应该不陌生,AspNetCoreRateLimit 是一个 ASP.NET Core 速率限制的解决方案,旨在控制客户端根据 IP 地址或客户端 ID 向 Web API 或 MVC 应用发出的请求的速率。AspNetCoreRateLimit 包含一个 IpRateLimitMiddlewareClientRateLimitMiddleware,每个中间件可以根据不同的场景配置限制允许 IP 或客户端,自定义这些限制策略,也可以将限制策略应用在每​​个 API URL 或具体的 HTTP Method 上。

实践

   起初是因为新做的项目中,有天查询日志发现,对外的几个公共接口经常被 “恶意” 调用,考虑到接口安全性问题,增加限流策略。

  AspNetCoreRateLimit GayHub:https://github.com/stefanprodan/AspNetCoreRateLimit

根据 IP 进行限流

  通过 nuget 安装 AspNetCoreRateLimit,当前版本是 3.0.5,因为实际项目中用的都是分布式缓存,在这里不用内存存储,而是结合 Redis 进行使用,内存存储直接参考官方的 Wiki 就可以了。

Install-Package AspNetCoreRateLimit 

Install-Package Microsoft.Extensions.Caching.Redis

  在 Startup.ConfigureServices 中将服务和其他依赖注入

public void ConfigureServices(IServiceCollection services)
        {
            #region MVC
            services.AddMvc(
              options =>
              {
                  options.UseCentralRoutePrefix(new RouteAttribute("api/"));
              }
              ).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            #endregion

            services.AddDistributedRedisCache(options =>
            {
                options.Configuration = "127.0.0.1:6379,password=123456,connectTimeout=5000,syncTimeout=10000"; 
                options.InstanceName = "WebRatelimit";
            }); 
            //加载配置
            services.AddOptions();
            //从appsettings.json获取相应配置
            services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
            
            //注入计数器和规则存储
            services.AddSingleton<IIpPolicyStore, DistributedCacheIpPolicyStore>();
            services.AddSingleton<IRateLimitCounterStore, DistributedCacheRateLimitCounterStore>();
            
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            //配置(计数器密钥生成器)
            services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
        }

  在 Startup.Configure 启用

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }
            //启用限流,需在UseMvc前面
            app.UseIpRateLimiting();
            app.UseMvc();
        }

  为了不影响 appsettings.json 的美观吧,可以新建一个 RateLimitConfig.json,并 Program 中启动加载中增加

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>().ConfigureAppConfiguration((host,config)=> 
                {
                    config.AddJsonFile($"RateLimitConfig.json", optional: true, reloadOnChange: true);
                });

  RateLimitConfig.json 配置如下:

{
  "IpRateLimiting": {
    //false则全局将应用限制,并且仅应用具有作为端点的规则* 。 true则限制将应用于每个端点,如{HTTP_Verb}{PATH}
    "EnableEndpointRateLimiting": true,
    //false则拒绝的API调用不会添加到调用次数计数器上
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 200,
    "QuotaExceededResponse": {
      "Content": "{{\"code\":429,\"msg\":\"访问过于频繁,请稍后重试\",\"data\":null}}",
      "ContentType": "application/json",
      "StatusCode": 200
    },
    "IpWhitelist": [ ],
    "EndpointWhitelist": [],
    "ClientWhitelist": [],
    "GeneralRules": [
      {
        "Endpoint": "*:/api/values/test",
        "Period": "5s",
        "Limit": 3
      }
    ]
  }
}

  重要配置说明:

       QuotaExceededResponse 是自定义返回的内容,所以必须设置 HttpStatusCodeStatusCode 为 200。

  GeneralRules 是具体的策略,根据不同需求配置不同端点即可, Period 的单位可以是 s, m, h, dLimint 是单位时间内的允许访问的次数;

  IpWhitelist 是 IP 白名单,本地调试或者 UAT 环境,可以加入相应的 IP,略过策略的限制;

       EndpointWhitelist 是端点白名单,如果全局配置了访问策略,设置端点白名单相当于 IP 白名单一样,略过策略的限制;

       其他配置项请参考 Wiki:https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/IpRateLimitMiddleware#setup

Fiddler 开始测试

测试接口:http://127.0.0.1:5000/api/values/Test

        [HttpGet]
        public object test()
        {
            return "ok";
        }

调用结果:

 

 调用次数和剩余调用次数在 Head 可以看到,(吃我一个链接:https://www.cnblogs.com/EminemJK/p/12720691.html)

 

 如果调用超过策略后,调用失败,返回我们自定义的内容

 

 在 Redis 客户端可以看到策略的一些情况,

 其他

  通常在项目中,Authorization 授权是少不了了,加入限流后,在被限流的接口调用后,限流拦截器使得跨域策略失效,故重写拦截器中间件,继承 IpRateLimitMiddleware 即可:

public class IPLimitMiddleware : IpRateLimitMiddleware
    {
        public IPLimitMiddleware(RequestDelegate next, IOptions<IpRateLimitOptions> options, IRateLimitCounterStore counterStore, IIpPolicyStore policyStore, IRateLimitConfiguration config, ILogger<IpRateLimitMiddleware> logger)
            : base(next, options, counterStore, policyStore, config, logger)
        {
        }

        public override Task ReturnQuotaExceededResponse(HttpContext httpContext, RateLimitRule rule, string retryAfter)
        {
            httpContext.Response.Headers.Append("Access-Control-Allow-Origin", "*");
            return base.ReturnQuotaExceededResponse(httpContext, rule, retryAfter);
        }
    }

  然后修改 Startup.Configure

//启用限流,需在UseMvc前面
        //app.UseIpRateLimiting();
        app.UseMiddleware<IPLimitMiddleware>();
        app.UseMvc();        

  特别需要注意的坑是,在其他文章的教程中,他们会写成:

app.UseMiddleware<IPLimitMiddleware>().UseIpRateLimiting();//错误的演示 https://www.cnblogs.com/EminemJK/p/12720691.html

  这些写你测试的时候会发现,

X-Rate-Limit-Remaining 递减量会变成 2,也不是递减 1,举栗子,配置如下:

"Endpoint": "*:/api/values/test",
        "Period": "3s",
        "Limit": 1

表示 3 秒内可以访问的次数是 1 一次,当发生调用的时候会直接返回被限制的提示,而不能正常访问接口。

最后

  AspNetCoreRateLimit 还可以根据客户端 ID 进行配置策略,具体可以看一下官方的 Wiki 吧。

 

ASP.NET 4.0 site displaying error - ISAPI “Restric

ASP.NET 4.0 site displaying error - ISAPI “Restric

http://stackoverflow.com/questions/10676473/asp-net-4-0-site-displaying-error-isapi-restriction-column-is-missing

在部署ASP.net 4.0项目过程中会出现的情况。

The requested content appears to be script and will not be served by the static file handler.

请执行一下代码
C:\Users\Administrator>cd..

C:\Users>cd..

C:\>cd Windows

C:\Windows>cd Microsoft.NET

C:\Windows\Microsoft.NET>cd Framework64

C:\Windows\Microsoft.NET\Framework64>cd v4.0.30319

C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis.exe -ir
Start installing ASP.NET (4.0.30319) without changing existing web applications
to use this version of ASP.Net.
..........
Finished installing ASP.NET (4.0.30319) without changing existing web applicatio
ns to use this version of ASP.Net.
之后给网站添加对应的4.0应用池


由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面。

进入IIS服务名称,点击ISAPI和CGI限制,进去后运行V4.0就OK


ASP.NET Core WebApi AspNetCoreRateLimit 限流中间件学习

ASP.NET Core WebApi AspNetCoreRateLimit 限流中间件学习

AspNetCoreRateLimit介绍:

AspNetCoreRateLimit是ASP.NET核心速率限制框架,能够对WebApi,Mvc中控制限流,AspNetCoreRateLimit包包含IpRateLimit中间件和ClientRateLimit中间件,每个中间件都可以为不同的场景设置多个限,该框架的作者是stefanprodan,项目nuget地址是https://github.com/stefanprodan/AspNetCoreRateLimit。

对客户端IP限流控制。

首先nuget安装 Install-Package AspNetCoreRateLimit ,在Startup中Code以下代码,添加服务和注入,其中的配置是什么;注释都有了。

// This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            //添加appsettings.json
            services.AddOptions();
            //需要存储速率和ip规则
            services.AddMemoryCache();
            //加载appsettings.json中的配置项 ,下面三项是加载general,rules
            services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
            services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies"));
            //注入计时器和规则
            services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
            services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
            //添加框架服务
            services.AddMvc();
        }

在Configure中配置RateLimit的启动

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();
            app.UseIpRateLimiting();
            if (env.IsDevelopment())
                app.UseDeveloperExceptionPage();
            app.UseMvc();
        }

 我们还需要再appsettings.json中写入配置和规则:

  "IpRateLimiting": {
    "EnableEndpointRateLimiting": false,
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],
    "EndpointWhitelist": [ "get:/api/license", "*:/api/status" ],
    "ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
    "GeneralRules": [
      {
        "Endpoint": "*",
        "Period": "1s",
        "Limit": 2
      },
      {
        "Endpoint": "*",
        "Period": "15m",
        "Limit": 100
      },
      {
        "Endpoint": "*",
        "Period": "12h",
        "Limit": 1000
      },
      {
        "Endpoint": "*",
        "Period": "7d",
        "Limit": 10000
      }
    ]
  }

如果EnableEndpointRateLimiting设置为false,那么这些限制就全局使用,例如,如果设置每秒5次调用的限制,对任何端口的任何http调用都计入这个限制,反之,如果它是true,那么该限制将应用于{端口}{path}中的每个端点。

如果stackblockedrequest设置为false,则不会将拒绝调用添加到节流阀计数器,如果你要拒绝你必须设置为true;

ClientidHeader用于提取白清单的客户端id,如果客户端id在这个里面,就不会应用速率限制。

覆盖特定IP一般规则:

"IpRateLimitPolicies": {
    "IpRules": [
      {
        "Ip": "84.247.85.224",
        "Rules": [
          {
            "Endpoint": "*",
            "Period": "1s",
            "Limit": 10
          },
          {
            "Endpoint": "*",
            "Period": "15m",
            "Limit": 200
          }
        ]
      },
      {
        "Ip": "192.168.3.22/25",
        "Rules": [
          {
            "Endpoint": "*",
            "Period": "1s",
            "Limit": 5
          },
          {
            "Endpoint": "*",
            "Period": "15m",
            "Limit": 150
          },
          {
            "Endpoint": "*",
            "Period": "12h",
            "Limit": 500
          }
        ]
      }
    ]
  }

 IP字段支持IP v4和v6值,我们还需要去定义速率限制规则

规则由端点,期间和限制组成,示例(将所有的端点的速率限制每秒2次呼叫),那么定义如下:

{
 "Endpoint": "*", "Period": "1s", "Limit": 2 }

 如果在同一端点,例如get/values在一秒中你调用了3次,那么第三次将会被阻止;但是如果说你在同一秒内还调用了Put/values那么不会阻止,因为他们不是在同一端点之中。在期间(Period)中,还有单位 s m h 等.

有的时候我们对拦截有一定的自定义需求的时候,我们可以继承IpRateLimitMiddleware,如以下定义:

public class CustomizationLimitMiddleware : IpRateLimitMiddleware
    {
        private readonly IpRateLimitOptions _options;
        private readonly IIpPolicyStore _ipPolicyStore;

        public CustomizationLimitMiddleware(RequestDelegate next, IOptions<IpRateLimitOptions> options, IRateLimitCounterStore counterStore, IIpPolicyStore policyStore, ILogger<IpRateLimitMiddleware> logger, IIpAddressParser ipParser = null) : base(next, options, counterStore, policyStore, logger, ipParser)
        {
             _options = options.Value;
            _ipPolicyStore = policyStore;
        }
        public override ClientRequestIdentity SetIdentity(HttpContext httpContext)
        {
            var clientId = "anon";
            if (httpContext.Request.Headers.Keys.Contains(_options.ClientIdHeader, StringComparer.CurrentCultureIgnoreCase))
            {
                clientId = httpContext.Request.Headers[_options.ClientIdHeader].First();
            }

            return new ClientRequestIdentity
            {
                Path = httpContext.Request.Path.ToString().ToLowerInvariant(),
                HttpVerb = httpContext.Request.Method.ToLowerInvariant(),
                ClientId = clientId
            };
        }
    }

 行为

当客户端进行HTTP调用时,IpRateLimitMiddleware执行以下操作:

  • 从请求体中获取IP,客户端IP,Http信息,和一些URL,如果需要修改自己的提取逻辑,可以覆盖IpRateLimitMiddleware.SetIdentity。
  • 在白名单中搜索IP,客户端ID和URL,如果有匹配则不执行任何操作
  • 在IP规则中搜索匹配项,所有适用的规则按期间分组,对于每个期间使用最严格的规则
  • 在匹配的一般规则中搜索,如果匹配的一般规则具有IP规则中不存在的定义时间段,则也使用此一般规则
  • 对于每个匹配规则,速率限制计数器递增,如果计数器值大于规则限制,则请求被阻止

如果请求被阻止,则客户端会收到如下文本响应:

Status Code: 429
Retry-After: 58
Content: API calls quota exceeded! maximum admitted 2 per 1m.

 如果请求没有得到速率限制,那么匹配规则中定义的最长周期用于组成X-Rate-Limit标头,这些标头将在响应中注入:

X-Rate-Limit-Limit: the rate limit period (eg. 1m, 12h, 1d)
X-Rate-Limit-Remaining: number of request remaining 
X-Rate-Limit-Reset: UTC date time (ISO 8601) when the limits resets

默认情况下,组织了客户端的调用我们都会记录到日志中,那么我们可以使用Microsoft.Extensions.Logging.ILogger,这个就略过了。

我们有的时候需要添加ip规则或者更新速率,如一下所示:

public class IpRateLimitController : Controller
{
	private readonly IpRateLimitOptions _options;
	private readonly IIpPolicyStore _ipPolicyStore;

	public IpRateLimitController(IOptions<IpRateLimitOptions> optionsAccessor, IIpPolicyStore ipPolicyStore)
	{
		_options = optionsAccessor.Value;
		_ipPolicyStore = ipPolicyStore;
	}

	[HttpGet]
	public IpRateLimitPolicies Get()
	{
		return _ipPolicyStore.Get(_options.IpPolicyPrefix);
	}

	[HttpPost]
	public void Post()
	{
		var pol = _ipPolicyStore.Get(_options.IpPolicyPrefix);
          //add
		pol.IpRules.Add(new IpRateLimitPolicy
		{
			Ip = "8.8.4.4",
			Rules = new List<RateLimitRule>(new RateLimitRule[] {
				new RateLimitRule {
					Endpoint = "*:/api/testupdate",
					Limit = 100,
					Period = "1d" }
			})
		});
          //update
		_ipPolicyStore.Set(_options.IpPolicyPrefix, pol);
	}
}

这样呢,你可以将ip限制的规则放到数据库中再推送到缓存中。

原文出处:https://www.cnblogs.com/ZaraNet/p/10119475.html

Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现

Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现

起因:

近期项目中,提供了一些调用频率较高的api接口,需要保障服务器的稳定运行;需要对提供的接口进行限流控制。避免因客户端频繁的请求导致服务器的压力。

一、AspNetCoreRateLimit 介绍

AspNetCoreRateLimit 是一个ASP.NET Core速率限制的解决方案,旨在控制客户端根据IP地址或客户端ID向Web API或MVC应用发出的请求的速率。AspNetCoreRateLimit包含一个 IpRateLimitMiddlewareClientRateLimitMiddleware ,每个中间件可以根据不同的场景配置限制允许IP或客户端,自定义这些限制策略,也可以将限制策略应用在每​​个API URL或具体的HTTP Method上。

二、AspNetCoreRateLimit使用

由上面介绍可知AspNetCoreRateLimit支持了两种方式:基于 客户端IP( IpRateLimitMiddleware) 和客户端ID( ClientRateLimitMiddleware )速率限制  接下来就分别说明使用方式

添加Nuget包引用:

Install-Package AspNetCoreRateLimit 

基于客户端IP速率限制

1、修改Startup.cs中方法:

public class Startup
{
  public Startup(IConfiguration configuration)
  {
    Configuration = configuration;
  }

  public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.
  public void ConfigureServices(IServiceCollection services)
  {
    //需要从加载配置文件appsettings.json
    services.AddOptions();
    //需要存储速率限制计算器和ip规则
    services.AddMemoryCache();

    //从appsettings.json中加载常规配置,IpRateLimiting与配置文件中节点对应
    services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));

    //从appsettings.json中加载Ip规则
    services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies"));

    //注入计数器和规则存储
    services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
    services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();

    services.AddControllers();

    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    //配置(解析器、计数器密钥生成器)
    services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();

    //Other Code
  }

  // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  {
    //Other Code

    app.UseRouting();

    app.UseAuthorization();
     //启用客户端IP限制速率
    app.UseIpRateLimiting();

    app.UseEndpoints(endpoints =>
    {
      endpoints.MapControllers();
    });
  }
}

2、在appsettings.json中添加通用配置项节点:(IpRateLimiting节点与Startup中取的节点对应)

"IpRateLimiting": {
 //false,则全局将应用限制,并且仅应用具有作为端点的规则*。例如,如果您设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制
 //true, 则限制将应用于每个端点,如{HTTP_Verb}{PATH}。例如,如果您为*:/api/values客户端设置每秒5个呼叫的限制,
 "EnableEndpointRateLimiting": false,
 //false,拒绝的API调用不会添加到调用次数计数器上;如 客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等) //,则必须设置StackBlockedRequests为true。
 "StackBlockedRequests": false,
 //Kestrel 服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置
 "RealIpHeader": "X-Real-IP",
 //取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。
 "ClientIdHeader": "X-ClientId",
 //限制状态码
 "HttpStatusCode": 429,
 ////IP白名单:支持Ip v4和v6 
 //"IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],
 ////端点白名单
 //"EndpointWhitelist": [ "get:/api/license", "*:/api/status" ],
 ////客户端白名单
 //"ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
 //通用规则
 "GeneralRules": [
  {
   //端点路径
   "Endpoint": "*",
   //时间段,格式:{数字}{单位};可使用单位:s, m, h, d
   "Period": "1s",
   //限制
   "Limit": 2
  },   //15分钟只能调用100次
  {"Endpoint": "*","Period": "15m","Limit": 100},   //12H只能调用1000
  {"Endpoint": "*","Period": "12h","Limit": 1000},   //7天只能调用10000次
  {"Endpoint": "*","Period": "7d","Limit": 10000}
 ]
}

配置节点已添加相应注释信息。

规则设置格式:

端点格式: {HTTP_Verb}:{PATH} ,您可以使用asterix符号来定位任何HTTP谓词。

期间格式: {INT}{PERIOD_TYPE} ,您可以使用以下期间类型之一: s, m, h, d

限制格式: {LONG}

3、特点Ip限制规则设置,在appsettings.json中添加 IP规则配置节点

"IpRateLimitPolicies": {
 //ip规则
 "IpRules": [
  {
   //IP
   "Ip": "84.247.85.224",
   //规则内容
   "Rules": [
    //1s请求10次
    {"Endpoint": "*","Period": "1s","Limit": 10},
    //15分钟请求200次
    {"Endpoint": "*","Period": "15m","Limit": 200}
   ]
  },
  {
   //ip支持设置多个
   "Ip": "192.168.3.22/25",
   "Rules": [
    //1秒请求5次
    {"Endpoint": "*","Period": "1s","Limit": 5},
    //15分钟请求150次
    {"Endpoint": "*","Period": "15m","Limit": 150},
    //12小时请求500次
    {"Endpoint": "*","Period": "12h","Limit": 500}
   ]
  }
 ]
}

基于客户端ID速率限制

1、修改Startup文件:

public void ConfigureServices(IServiceCollection services)
{
  //需要从加载配置文件appsettings.json
  services.AddOptions();

  //需要存储速率限制计算器和ip规则
  services.AddMemoryCache();

  //从appsettings.json中加载常规配置
  services.Configure<ClientRateLimitOptions>(Configuration.GetSection("IPRateLimiting"));

  //从appsettings.json中加载客户端规则
  services.Configure<ClientRateLimitPolicies>(Configuration.GetSection("ClientRateLimitPolicies"));

  //注入计数器和规则存储
  services.AddSingleton<IClientPolicyStore, MemoryCacheClientPolicyStore>();
  services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();

  
  services.AddControllers();

    // https://github.com/aspnet/Hosting/issues/793
    // the IHttpContextAccessor service is not registered by default.
    //注入计数器和规则存储
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    //配置(解析器、计数器密钥生成器)
    services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //启用客户端限制
  app.UseClientRateLimiting();

  app.UseMvc();
}

2、通用配置采用IP限制相同配置,添加客户端限制配置:

//客户端限制设置
"ClientRateLimitPolicies": {
 "ClientRules": [
  {
   //客户端id
   "ClientId": "client-id-1",
   "Rules": [
    {"Endpoint": "*","Period": "1s","Limit": 10},
    {"Endpoint": "*","Period": "15m","Limit": 200}
   ]
  },
  {
   "ClientId": "client-id-2",
   "Rules": [
    {"Endpoint": "*","Period": "1s","Limit": 5},
    {"Endpoint": "*","Period": "15m","Limit": 150},
    {"Endpoint": "*","Period": "12h","Limit": 500}
   ]
  }
 ]
}

3、调用结果:

设置规则:1s只能调用一次:首次调用

调用第二次:自定义返回内容

三、其他

 运行时更新速率限制

添加 IpRateLimitController控制器:

/// <summary>
/// IP限制控制器
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class IpRateLimitController : ControllerBase
{

  private readonly IpRateLimitOptions _options;
  private readonly IIpPolicyStore _ipPolicyStore;

  /// <summary>
  /// 
  /// </summary>
  /// <param name="optionsAccessor"></param>
  /// <param name="ipPolicyStore"></param>
  public IpRateLimitController(IOptions<IpRateLimitOptions> optionsAccessor, IIpPolicyStore ipPolicyStore)
  {
    _options = optionsAccessor.Value;
    _ipPolicyStore = ipPolicyStore;
  }

  /// <summary>
  /// 获取限制规则
  /// </summary>
  /// <returns></returns>
  [HttpGet]
  public async Task<IpRateLimitPolicies> Get()
  {
    return await _ipPolicyStore.GetAsync(_options.IpPolicyPrefix);
  }

  /// <summary>
  /// 
  /// </summary>
  [HttpPost]
  public async Task Post(IpRateLimitPolicy ipRate)
  {
    var pol = await _ipPolicyStore.GetAsync(_options.IpPolicyPrefix);
    if (ipRate != null)
    {
      pol.IpRules.Add(ipRate);
      await _ipPolicyStore.SetAsync(_options.IpPolicyPrefix, pol);
    }
  }
}

分布式部署时,需要将速率限制计算器和ip规则存储到分布式缓存中如Redis

修改注入对象

// inject counter and rules distributed cache stores
services.AddSingleton<IClientPolicyStore, DistributedCacheClientPolicyStore>();
services.AddSingleton<IRateLimitCounterStore,DistributedCacheRateLimitCounterStore>();

添加Nuget包  Microsoft.Extensions.Caching.StackExchangeRedis 

在Startup中设置Redis连接

services.AddStackExchangeRedisCache(options =>
{
  options.ConfigurationOptions = new ConfigurationOptions
  {
    //silently retry in the background if the Redis connection is temporarily down
    AbortOnConnectFail = false
  };
  options.Configuration = "localhost:6379";
  options.InstanceName = "AspNetRateLimit";
});

限制时自定义相应结果:

//请求返回
  "QuotaExceededResponse": {
   "Content": "{{\"code\":429,\"msg\":\"Visit too frequently, please try again later\",\"data\":null}}",
   "ContentType": "application/json;utf-8",
   "StatusCode": 429
  },

调用时返回结果:

其他:

示例代码:https://github.com/cwsheng/WebAPIVersionDemo

到此这篇关于Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现的文章就介绍到这了,更多相关Asp.NET Core 限流控制内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • .NET 6中的dotnet monitor讲解
  • ASP.NET Core在Linux下为dotnet创建守护进程
  • .NET 6 中的 dotnet monitor详细解析
  • .NET垃圾回收GC诊断工具dotnet-gcmon使用
  • 发布asp.net core时如何修改ASPNETCORE_ENVIRONMENT环境变量
  • 编译 dotnet和aspnetcore 源代码详情

关于asp.net – Sitecore:按字段选择项目:TreelistExaspnet单选按钮的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.Net Core 结合 AspNetCoreRateLimit 实现限流、ASP.NET 4.0 site displaying error - ISAPI “Restric、ASP.NET Core WebApi AspNetCoreRateLimit 限流中间件学习、Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现的相关知识,请在本站寻找。

本文标签: