1

Windowsサービスとしてasp.netコア2 Web APIを実行しています。私はIISを介して私の設定値を読むことができる問題をデバッグするとき。asp.netコア2 Web API appsetting.jsonの値がWindowsサービスとしてデプロイされているときに読み取られない

しかし、サービスとして実行すると、値が戻ってきません。

appsettings.json 

{ 
    "Database": { 
    "DatabaseName": "testdb", 
    "DatabaseServer": "localhost", 
    "DatabaseUserName": "admin", 
    "DatabasePassword": "admin" 
    } 
} 

public string GetConnectionString() 
    { 
     var databaseName = Configuration["Database:DatabaseName"]; 
     var databaseServer = Configuration["Database:DatabaseServer"]; 
     var username = Configuration["Database:DatabaseUserName"]; 
     var password = Configuration["Database:DatabasePassword"]; 


     return $"Data Source={databaseServer};Initial Catalog={databaseName};Persist Security Info=True;User ID={username};Password={password};MultipleActiveResultSets=True"; 
    } 

アプリケーションを公開した後にその値を読み取ることができない理由がわかりません。公開されているappsettings.jsonファイルには値があります。

ここに私のstartup.csがあります。私は新しいasp.netコア2でappSettings.jsonファイルを参照する必要はなかったという印象の下にあった。

public class Startup 
{ 
    public Startup(IConfiguration configuration) 
    { 
     Configuration = configuration; 
    } 

    public IConfiguration Configuration { get; } 

    // This method gets called by the runtime. Use this method to add services to the container. 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(); 
     AutoMapper.Mapper.Initialize(cfg => 
     { 
      cfg.CreateMap<InventoryTransaction, Models.InventoryTransactionModel>(); 
      cfg.CreateMap<ReasonCode, Models.ReasonCodeModel>(); 
      cfg.CreateMap<InventoryTransaction, Models.InventoryTransactionForCreationModel>(); 
      cfg.CreateMap<InventoryTransactionForCreationModel, InventoryTransaction>(); 
     }); 
     services.AddScoped<IInventoryTransactionRepository, InventoryTransactionRepository>(); 
     services.AddSingleton<IConfiguration>(Configuration); 
     services.AddDbContext<VPSInventoryContext>(options => options.UseSqlServer(GetConnectionString())); 

    } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(); 
     loggerFactory.AddDebug(); 
     loggerFactory.AddNLog(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
     } 

     app.UseMvc(); 

    } 

    public string GetConnectionString() 
    { 
     var databaseName = Configuration["Database:DatabaseName"]; 
     var databaseServer = Configuration["Database:DatabaseServer"]; 
     var username = Configuration["Database:DatabaseUserName"]; 
     var password = Configuration["Database:DatabasePassword"]; 


     return $"Data Source={databaseServer};Initial Catalog={databaseName};Persist Security Info=True;User ID={username};Password={password};MultipleActiveResultSets=True"; 
    } 
} 

ここで私はWindowsサービスとして実行している私のProgram.csです。

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     if (Debugger.IsAttached || args.Contains("--debug")) 
     { 
      BuildWebHost(args).Run(); 
     } 
     else 
     { 
      BuildWebHost(args).RunAsService(); 
     } 
    } 

    public static IWebHost BuildWebHost(string[] args) => 
     WebHost.CreateDefaultBuilder(args) 
      .UseStartup<Startup>() 
      .Build(); 
} 
+0

負荷設定のコードを共有してください。あなたは 'AddJsonFile'拡張コールを使いますか? – CodeFuller

+0

私はそうではありません、私はデフォルトの方法を使用します。 – Mitch

+0

'RunAsService()'呼び出しに 'Microsoft.AspNetCore.Hosting.WindowsServices NuGet'を使用していますか? .Net Coreアプリケーションでどのように使用しましたか?現在、.Net Frameworkのみ(https://github.com/aspnet/Hosting/issues/1173)でサポートされています。私はasp.netコアアプリケーションと使用して未処理の例外を取得しようとしました:System.TypeLoadException: 'System.ServiceProcess.ServiceBase'アセンブリ 'System.ServiceProcess'からロードできませんでした – CodeFuller

答えて

2

あなたがサービスとしてアプリケーションを起動すると、作業ディレクトリがC:\Windows\System32\のように、システムディレクトリに設定されています。設定ファイルは同じディレクトリにあります。それが欠けている限り、空の設定がロードされます。それを修正する

、ちょうどあなたのアプリケーションが配置されているものに作業ディレクトリを設定します。

public static void Main(string[] args) 
{ 
    if (Debugger.IsAttached || args.Contains("--debug")) 
    { 
     BuildWebHost(args).Run(); 
    } 
    else 
    { 
     var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
     Directory.SetCurrentDirectory(path); 
     BuildWebHost(args).RunAsService(); 
    } 
} 
+0

恐ろしい!私と一緒にこれをやってくれてありがとう。 – Mitch

関連する問題