2017-06-28 8 views
0

設定、データベース接続、Web APIのURL、認証サーバーのURLなどにアクセスする必要のあるプロジェクトが多数ありますが、それはその展開によって変わります。app.configからコンパイル時ではなく実行時に設定を取得できますか?

アプリケーションは、異なるデータベースとWebサーバーを持つ異なる部門に複数回展開できます。

最初、私はappSettingsを使用してプロパティとして公開していました。これはide(Visual Studio 2013)を使用した開発で動作するように見えました。

正確に位置を取得するために、私はアドバイスhereに従っており、動作するようでした。 だから最初は私が持っていた:いくつかの時点で

private static KeyValueConfigurationCollection GetAppSettings() 
    { 
     // The dllPath can't just use Assembly.GetExecutingAssembly().Location as ASP.NET doesn't copy the config to shadow copy path 
     var dllPath = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase).LocalPath; 
     var dllConfig = ConfigurationManager.OpenExeConfiguration(dllPath); 

     // Get the appSettings section 
     var appSettings = (AppSettingsSection)dllConfig.GetSection("appSettings"); 
     return appSettings.Settings; 
    } 

public string AknowledgeSTSOrigin 
     { 
      get 
      { 
       string setting; 
       if (_aknowledgeSTSOrigin != null) 
       { 
        setting = _aknowledgeSTSOrigin; 
       } 
       else 
       { 
        if (System.Diagnostics.Debugger.IsAttached) 
        { 
         setting = "https://localhost:44333"; 
        } 
        else 
        { 
         var settings = GetAppSettings(); 
         if (settings.Count > 0) 
         { 
          setting = settings["AknowledgeSTSOrigin"].Value; 
         } 
         else 
         { 
          setting = System.Configuration.ConfigurationManager.AppSettings["AknowledgeSTSOrigin"]; 
         } 
        } 
        _aknowledgeSTSOrigin =setting; 
       } 
       return setting; 
      } 
     } 

は、それが動作を停止 - 残念ながら、私はそれは常に、デバッガ接続状態をデフォルトたので、私はIDEで実行していたためか、なぜさっぱりだが。 この時点での問題は、上記のすべてのルートがappSettingsからnullを戻していたことでした。 問題を検索するときに、プロジェクトプロパティを使用することが推奨されています。私はそうしました - 新しいApplicationSettingsセクションがapp.configに現れ、プロパティが見つかりました。上記のように簡略化しまっ だから:

setting = Properties.Settings.Default.AknowledgeSTSOrigin; 

これは素晴らしい仕事を、私はIDEで実行してテストするためにlocalhostに値を設定する - すべての良いです。私はコンパイルし、アプリを公開してから、サーバー上のapp.configを変更しようとしました。それでもサーバー上では動作しません。しかし、マシンのapp.configを変更してサーバーの設定を変更し、再構築して公開すると、それが動作します。

このメソッドは、コンパイル時にapp.configからプロパティを取得するようです。

私がしたいことは、実行時に設定ファイルからそれらを取得できるようにすることです。アプリケーションを一度構築し、複数回展開した後、デプロイメント固有の設定で設定を更新するだけです。

私はこれをグーグルで試してみましたが、何か有用なものは見つけられませんでした。

this postあたりとして

Properties.Settings.Default.Reload(); 

を追加しようとしたが動作していません。

Target Framework = .Net 4.5とそのクラスライブラリ。エラーメッセージは、コンパイル時に設定ファイルから値を取得していることを示しています。 (正しいパスを持っているかのようなエラーメッセージはエラーではありません)

EDIt: さらに混乱しています。 postは、GenerateDefaultValueInCodeをfalseに設定しない限り、デフォルトでプロパティがコンパイルされることを示しています。私はこれをやっているし、今私はプロパティのnullを返すと同じ結果に戻っている。何らかの理由で、すべてのプロパティに対して値をfalseに設定していても、dllに埋め込まれた状態で表示されます。

+0

app.configの設定は、アプリケーションの起動時にメモリに読み込まれます。私は何回も再コンパイルせずにアプリの設定を100%変更することができます。 IISでホストされているアプリケーションでは、アプリケーションプールは自動的にリサイクルされますが、応答はキャッシュされます。安全に行うには、アプリケーションプールを手動で再起動します。 Windowsサービスや他のアプリケーションもおそらく再起動する必要があります –

+0

@ ste-fu私はアプリケーションプールをリサイクルしてアプリケーションを再起動し、さらにサーバを再起動しました。私は2つのサーバーを持っています。私がコンパイルしたものにデプロイする - うまく動作します。他の人にデプロイする - configから設定を取得しない。 – SteveL

+0

編集中の.configファイルの名前は何ですか?それはYourAppliacationName.exe.config *ではない* app.configですか? – aquinas

答えて

0

見つかった! 問題はクラスライブラリで発生していました。 私はクラスライブラリの設定を作成しますが、設定はapp.configに追加されますが、実際にはそれを検索するためのものではありません。代わりに、それはクラスライブラリを消費する親のweb.configです。 設定をweb.configに入れても動作するようです。

関連する問題