asp.netコアアプリケーション構成のリロード
イントロ
私は、データベースに置くかのRedisを設定し、私は直接データベースを変更したい場合に設定を変更して、アプリケーション構成のリロードにインターフェースを呼び出す必要があるので、彼は書き込み実行時のインターフェイスのコンフィギュレーションをリロードしてみました。
達成の設定リロード
インターフェイスの設定は実際には非常に簡単ですリロードし、目を通すConfiguration
知っているソースコードは、アプリケーションの設定を再ロードする場合必要がIConfigurationRoot
ターゲットに、そしてIConfigurationRoot
実際には直接取得するサービスに注入することができるIConfiguration
オブジェクトを、サービスIConfiguration
オブジェクトも達成されたIConfigurationRoot
インタフェースのインスタンスを。その後、我々は多くが明確であることを一緒にソースコードを参照してください。
構成コードをリロード達成するために見て
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
namespace TestWebApplication.Controllers
{
[Route("api/[controller]")]
public class ConfigurationsController : Controller
{
private readonly IConfigurationRoot _configuration;
public ConfigurationsController(IConfiguration configuration)
{
_configuration = configuration as IConfigurationRoot;
}
[HttpGet]
public IActionResult Get()
{
return Ok(new
{
RootUser = _configuration.GetAppSetting("RootUser") // 这里 GetAppSetting 是一个自定义扩展方法,获取AppSettings 节点下的配置信息
});
}
[HttpPut]
public IActionResult Put()
{
_configuration.Reload();
return Ok();
}
}
}
ライト:
/// <summary>
/// 重新加载系统配置
/// </summary>
/// <returns></returns>
public IActionResult ReloadConfiguration()
{
var configurationRoot = HttpContext.RequestServices.GetService<IConfiguration>() as IConfigurationRoot;
if (null == configurationRoot)
{
return BadRequest();
}
configurationRoot.Reload();
return Ok();
}
それは単純ではない、あなたはこれを参照することができ、のはそれを試してみましょうサンプルプロジェクト
以来、あなたが変更した場合、プロジェクトのデフォルトの設定を再リロードします、appsettings.jsonファイルの変更かどうかを監視し、ここで私はここで設定した新しいファイルを追加reloadOnChange
するためにfalse
、次のようにサンプルコードを:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(configBuilder =>
{
configBuilder.AddJsonFile("abc.json", optional: true, reloadOnChange: false);
})
.UseStartup<Startup>();
次のように文書abc.json読み取ります。
{
"AppSettings": {
"TestNumber": 12,
"RootUser": "WeihanLi"
}
}
dotnet run
Webサイトを起動し、ブラウザで訪問のhttp:// localhostを:5000 / API /構成
私たちは、その後、ファイルabc.jsonを変更します
{
"AppSettings": {
"TestNumber": 12,
"RootUser": "WeihanLi 123"
}
}
ただページを更新して保存した変更したら、コンテンツを見ることができるか、単にコンフィギュレーションをリロードしないことを証明するために、設定を再ロードするために私たちの次の試み
あなたはPUTリクエストを送信したいと郵便配達員やシオマネキや他のツールを使用しhttp://localhost:5000/api/configurations
て、ここで私は郵便配達の呼び出しは、インターフェイスコンフィギュレーションをリロードPUT使用
つまり、インターフェイスが200コールが成功した、ただページを更新返し、ページ上のデータを見ることができるのも、私たちが力の設定インターフェースをリロードすることを証明している、変更されています。
ソース決意
見ConfigurationBuilder
たときにビルド、何をすべきかでConfigurationBuilder
ソース
ここでは、最後のリターンがある見ることができIConfigurationRoot
、ターゲット、その後、見IConfigurationRoot
ソースコード
あなたは見ることができるIConfigurationRoot
の定義Reload
方法は、以下からこの方法をProviders
我々が知ることができる場所を確認、設定をリロードするアプリケーションの設定を再ロードする方法を、その後、私たちは見てきた何済のhttps:// github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/WebHost.cs#L149IConfiguration
Reload
WebHost.CreateDefaultBuilder(args).Build()
appsettings.jsonが自動的に設定ファイルをリロードします理由はここに私たちが見ることができる、あなたは最後のリターンを見ることができるWebHostBuilder
オブジェクト
Asp.Netコア見てWebHostBuilder
オブジェクトのBuild
メソッドをhttps://github.com/aspnet/AspNetCore/blob/master/src/Hosting/Hosting/src/WebHostBuilder.cs#L135
BuildCommonServices
コードのこの部分を見ることができるhttps://github.com/aspnet/AspNetCore/blob/master/src/Hosting/Hosting/src/WebHostBuilder.cs#L277
我々はすでに知っていることの上にConfigurationBuilder
リターンが後にビルドしIConfigurationRoot
たオブジェクト、およびこの注入はIConfiguration
、ターゲット(IConfigurationRoot
実装するIConfiguration
インタフェースを)ので、私たちはから依存性の注入を得ることができるIConfiguration
ように直接オブジェクトIConfigurationRoot
我々が直接取得する理由は、使用する、IConfiguration
オブジェクトを直接as IConfigurationRoot
メモ
一時的にこの目的を達成するために、私はあなたが何かを得ることを願って -