![](/img/trans.png)
[英]How can I access AppSettings from an ActionFilterAttribute in ASP.NET Core
[英]How can I access AppSettings from an ActionFilterAttribute
我需要從ActionFilterAttribute中的appsettings.json文件中獲取值。 我點擊了此鏈接( 如何從ASP.NET Core中的ActionFilterAttribute訪問AppSettings ),但這無濟於事,因為我需要將參數傳遞給自定義過濾器,並且還需要使用來自appsettings.json的參數。 例如
//Filter.cs
[AttributeUsage(AttributeTargets.Method)]
public class ThrottleAttribute : ActionFilterAttribute
{
public string Count { get; set; }
private static MemoryCache Cache { get; } = new MemoryCache(new MemoryCacheOptions());
public override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
{
//Compare this.Count with GetValueFromAppSettings.json
}
}
//Controller.cs
[ApiController]
[Route("api/[controller]")]
public class ValuesController : BaseController
{
// GET api/values
[HttpGet]
[Authorize]
[Throttle(Count = 15)]
public ActionResult<IEnumerable<string>> Get()
{
return new[] { "value1", "value2" };
}
}
appsettings.json應該在DI中注冊,因此您可以將IConfiguration
傳遞給ThrottleAttribute
構造函數並通過DI從中獲取值,但是您需要創建工廠才能使其工作:
public class ThrottleAttributeFactory: ActionFilterAttribute, IFilterFactory
{
public string Count { get; set; }
public bool IsReusable => false;
public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
{
var attribute = serviceProvider.GetService<ThrottleAttribute>();
attribute.Count = Count;
return attribute;
}
}
屬性:
public class ThrottleAttribute : ActionFilterAttribute
{
private readonly IConfiguration _config;
public string Count { get; set; }
public ThrottleAttribute(IConfiguration config)
{
_config = config;
}
//rest of code omitted
}
在您的方法中:
{
var value = _config.GetValue<int>("json:key");
}
並在控制器中將[Throttle(Count = 15)]
替換為[ThrottleAttributeFactory(Count = 15)]
。
還要注冊屬性: services.AddScoped<ThrottleAttribute>();
在您的情況下, IFilterFactory
實現將是最佳選擇。
public class ThrottleAttributeFactory : Attribute, IFilterFactory
{
public string Count { get; set; }
public bool IsReusable => false;
public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
{
var filter = serviceProvider.GetService<ThrottleAttribute>();
filter.Count = Count;
return filter;
}
}
然后可以將其注入構造函數
private readonly IConfiguration config;
public ThrottleAttribute(IConfiguration config)
{
this.config = config;
}
您必須將[Throttle(Count = 15)]
更改為[ThrottleAttributeFactory(Count = 15)]
並且不要忘記在Startup.cs中注冊IConfiguration和屬性:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSingleton<IConfiguration>(Configuration);
services.AddScoped<ThrottleAttribute>();
}
您可以在Throttle
類中添加靜態屬性,並將配置值存儲在其中。 然后,可以在啟動類中設置該值。
[AttributeUsage(AttributeTargets.Method)]
public class ThrottleAttribute : ActionFilterAttribute
{
public string Count { get; set; }
public static string ConfigCount { get; set; }
private static MemoryCache Cache { get; } = new MemoryCache(new MemoryCacheOptions());
public override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
{
//Compare this.Count with GetValueFromAppSettings.json
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
ThrottleAttribute.ConfigCount = Configuration.GetValue<int>("key");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.