1

HomeController内のアクションにカスタム属性が設定された.NET Core 1.1アプリケーションがあります。属性ロジック内で設定ファイル(appsettings.json)から値が必要な場合、属性レベルで設定にアクセスできますか?.NETコアの属性内の構成(appsettings)値を読み取る方法は?

appsettings.json

{ 
    "Api": { 
     "Url": "http://localhost/api" 
    } 
} 

HandleSomethingAttribute.cs

public class HandleSomethingAttribute : Attribute, IActionFilter 
{ 
    public void OnActionExecuting(ActionExecutingContext context) 
    { 
     // read the api url somehow from appsettings.json 
    } 

    public void OnActionExecuted(ActionExecutedContext context) 
    { 
    } 
} 

HomeController.cs

public class HomeController: Controller 
{ 
    [HandleSomething] 
    public IActionResult Index() 
    { 
     return View(); 
    } 
} 
+0

はあなたが持っているとあなたが達成しようとしているもの何のためにいくつかのコードを共有することはできますか? – Shoe

+0

@Shoe更新された質問を参照 –

+2

ここに同じ問題があります...解決できますか? – Dzhambazov

答えて

2
public HandleSomethingAttribute() 
{ 
    var builder = new ConfigurationBuilder() 
     .SetBasePath(Directory.GetCurrentDirectory()) 
     .AddJsonFile("appsettings.json"); 
    Configuration = builder.Build(); 

    string url = Configuration.GetSection("Api:Url").Value; 
} 

こんにちは、属性コンストラクタでこれを試してください。それは働くはずです!

+0

環境名にはどのようにアクセスすればよいですか?私は開発と生産のために異なるappSettingsを持っているので –

2

私は同じことをやっています。私はDzhambazovの解決策に似た何かをしましたが、環境名を得るために私はEnvironment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")を使用しました。これを私のプロジェクトのどこからでも読むことができる静的なクラスの静的変数に入れます。

public static class AppSettingsConfig 
{ 
    public static IConfiguration Configuration { get; } = new ConfigurationBuilder() 
     .SetBasePath(Directory.GetCurrentDirectory()) 
     .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) 
     .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true) 
     .Build(); 
} 

私はそうのような属性からこれを呼び出すことができます。

public class SomeAttribute : Attribute 
{ 
    public SomeAttribute() 
    { 
     AppSettingsConfig.Configuration.GetValue<bool>("SomeBooleanKey"); 
    } 
} 
関連する問題