2017-10-04 4 views
3

나는 ASP.NET 코어 2.0을 사용하고 있는데 나는 Main 방법이 같은 구성 코드가 : I는 reloadOnChang 전자가 true로 설정 한ASP.NET 핵심 구성 reloadOnChange는

public static void Main(string[] args) 
{ 
    var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); 
    var configuration = new ConfigurationBuilder() 
     .SetBasePath(Directory.GetCurrentDirectory()) 
     .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
     .AddJsonFile($"appsettings.{environment ?? "Production"}.json", optional: true, reloadOnChange: true) 
     .AddEnvironmentVariables() 
     .AddCommandLine(args) 
     .Build(); 
} 

을 그리고 내 컨트롤러에서 나는 IOptionsSnapshot

public HomeController(ILogger<HomeController> logger, IOptionsSnapshot<AppSettings> options) 

을 사용하고 있습니다하지만 내 appsettings.json의 값을 수정할 때, 나는 내 응용 프로그램마다 다시 시작해야하거나 변경 만 새로 고침에 의해 선택되지 않는 브라우저. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 콘솔과 IIS Express 모두에서 앱을 실행하려고했습니다. 나는 또한 IOptionsMonitor 같은 것을 시도했다. Btw. IOptionsMonitorIOptionsSnapshot의 차이점은 무엇입니까?

+0

어떻게'AppSettings' 옵션을 등록 하시겠습니까? – poke

+0

이 서비스처럼 Startup.cs에서 AppSettings를 추가했습니다. 구성 (Configuration.GetSection ("AppSettings")); –

답변

8

reloadOnChange에서 설명한대로 IOptions<T> 대신 IOptionsSnapshot<T>을 삽입하면 충분합니다. 그래도 해당 유형을 올바르게 구성해야합니다. T. 일반적으로 구성 등록은 다음과 같이 표시됩니다

services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); 

그러나, 가까운 코드에서 찾고, 당신이 당신의 프로그램을 구성하는 새로운 ASP.NET 코어 2.0 방법을 사용하고 있는지 보이지 않는다. 구성은 이제 종속성 삽입의 일부이므로 ConfigureAppConfiguration을 사용하여 WebHostBuilder의 일부로 구성합니다. 즉, 예를 들어 다음과 같이 수 :

public static IWebHost BuildWebHost() 
    => new WebHostBuilder() 
     .UseKestrel() 
     .UseContentRoot(Directory.GetCurrentDirectory()) 
     .ConfigureAppConfiguration((builderContext, config) => 
     { 
      IHostingEnvironment env = builderContext.HostingEnvironment; 

      config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); 
      config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); 
     }) 
     .UseStartup<Startup>() 
     .Build(); 

당신이 WebHost.CreateDefaultBuilder()를 사용하여 기본 빌더를 사용하는 경우 구성이 자동으로 활성화 reloadOnChange와 그런 설정으로, 당신도,이 작업을 수행 할 필요가 없습니다.


IOptionsSnapshotIOptionsMonitor의 차이는 IOptionsSnapshot 그냥 IOptionsSnapshot<T> 객체가 건설되고있는 시간에 당신에게 옵션의 스냅 샷을 줄 것입니다.

그 이유는 정확히 IOptions<T>과 같습니다. 생성자에 삽입 한 다음 나중에 options.Value을 인스턴스에 저장하여 나중에 옵션에 액세스합니다. 이 시점에서 그 객체는 고정되어 결코 변경되지 않습니다. IOptionsSnapshot<T>IOptions<T>과 같은 단일 종속성 대신 범위가 지정된 종속성으로 등록되어 있으므로 한 번만 요청하는 대신 모든 요청에서 현재 구성 값을 가져올 수 있습니다.

그러나 IOptionsMonitor<T>은 주어진 시간에 현재 구성 값을 검색 할 수있는 싱글 톤 서비스입니다. 따라서 필요할 때마다 현재 구성을 가져와야하는 싱글 톤 서비스에 특히 유용합니다. 또한 옵션 모니터는 푸시 메커니즘을 제공하여 구성 소스의 구성 변경 사항을 알립니다. 그렇게하면 구성 변경 사항을 명시 적으로 처리 할 수 ​​있습니다.

옵션 스냅 샷은 일시적 또는 범위 종속성에 사용하도록 설계되었으므로 대부분의 시간대 옵션을 사용할 수 있습니다.드물게 이 가장 최신 구성을 가져야하는 싱글 톤 서비스를 사용하는 경우이있는 경우에만 옵션 모니터를 사용해야합니다. 이 경우 스냅 샷에서 모니터로 전환하는 것만으로는 충분하지 않습니다. 일반적으로 변경된 구성을 어떤 방식 으로든 처리해야합니다 (예 : 상태 지우기, 캐시 지우기 등). 따라서 항상 의 모든 내용을 다시로드해야하는지 여부를 항상 고려해야합니다. 또는을 다시 시작하거나 응용 프로그램을 다시 시작하는 것이 실용적인 대안이 아닌지 생각해야합니다.

+0

답장을 보내 주셔서 감사합니다. 내 구성 코드를 당신처럼 업데이트했고 내 컨트롤러의 AppSettings가 작동했습니다. 그러나 미들웨어가 컨트롤러로 구성 변경 사항에 반응해야한다면, MyMiddleware (RequestDelegate, IOptionsSnapshot 옵션, ILoggerFactory loggerFactory) 변경 사항을 여전히 픽업하지 않는 미들웨어 생성자에이 코드가 있습니까? –

+0

@fanray 그래, 미들웨어는 불행히도 다른 것입니다. 미들웨어는 응용 프로그램이 실행되고'Startup.Configure' 메서드가 실행될 때 * 한번 * 설정됩니다. 따라서 모든 종속성은 그 시점에서 해결되고 미들웨어 인스턴스는 공유 인스턴스로 유지됩니다. 따라서 옵션을 주입 할 수는 없습니다. 예를 들어,'context.RequestServices.GetRequiredService >()'를 사용하여'Invoke' 메소드 내에서 옵션을 해결해야합니다. – poke

+0

안녕하세요 @ poke var 설정 = context.RequestServices.GetService >(). 값으로 내 미들웨어에서 작동하도록했습니다. 모든 요청이이 미들웨어에 제공되면이 GetService 코드가 성능에 영향을 줍니까? 마지막으로 Startup의 ConfigureServices 메서드에서 AppSettings 개체를 가져 오는 방법이 있습니까? 고맙습니다! –

관련 문제