Open chandde opened 4 years ago
I resolved this issue by converting the entire IpRateLimiting configuration into a json, and put the json string in app settings (or Azure App Service Configuration),
{
"otherconfigurations": "othervalues",
"IpRateLimiting": "{\"EnableEndpointRateLimiting\":true,\"StackBlockedRequests\":false,\"RealIPHeader\":\"X-Real-IP\",\"ClientIdHeader\":\"X-ClientId\",\"HttpStatusCode\":429,\"GeneralRules\":[{\"Endpoint\":\"*\",\"Period\":\"10m\",\"Limit\":60},{\"Endpoint\":\"*:/sendemail\",\"Period\":\"5m\",\"Limit\":5}]}"
}
}
At runtime, read the configuration value string, build a new configuration by the json stream
var ipRateLimitingStr = config.GetSection("IpRateLimiting");
var ipRateLimitingConfiguration = new ConfigurationBuilder().AddJsonStream(new MemoryStream(Encoding.ASCII.GetBytes(ipRateLimitingStr.Value))).Build();
services.Configure<IpRateLimitOptions>(ipRateLimitingConfiguration);
I use Azure App Configuration and I can set these values like "True" and they get converted into an actual boolean value when IOptionsSnapshot<IPRateLimitOptions>
or IOptionsSnapshot<ClientRateLimitOptions>
is used. You can test this yourself by injecting one of those into your controller or service and observing the property in your debugger.
I would assume it would be the same with Azure App Service Configuration since it's just another configuration source.
When I locally tested it and it worked pretty well, however, I have an Asp.Net Core App Service running in Azure, I use App Service Configuration to set the configs, there is a requirement that all settings key and value must be string type (i.e. quoted, here's a link to Azure Docs https://docs.microsoft.com/en-us/azure/app-service/configure-common), however package uses a few boolean and integer setting values, how should I make it work? see below snapshot, is there a way to work around this?
Do I have to load the string version of config, then build another config with manual conversion ("true" -> true, "20" -> 20) then feed the component?