2009-02-20 5 views
73

私は2つのアプリケーションがコンソールアプリケーションともう1つはASP.NETアプリケーションを持っています。彼らは両方とも同じappSettingsとconnectionStringsを知る必要があります。理想的には、app.config/web.configファイルのconfigSourceプロパティを使用して、その場所を中心にしたいと考えています。例えば、しかしエラーで失敗し.NET構成ファイルアプリケーションディレクトリフォルダーの外にconfigSource

<connectionStrings configSource="D:\connectionStrings.config"/> 
<appSettings configSource="D:\appSettings.config"/> 

について:

The configSource attribute is invalid.: The configSource 'D:\appSettings.config' is invalid. It must refer to a file in the same directory or in a subdirectory as the configuration file.

はまだ設定マネージャのappSettings /のconnectionStringsを使用し、外部の場所から値を取得するためにとにかくはありますか?
私はそれを行うコードを追加することに満足していますが、私は構成マネージャシステム全体を置き換える必要はありません。

答えて

85

もう1つの解決策は、ファイルをプロジェクトに実際にコピーするのではなく、リンクとしてすべてのプロジェクトに設定ファイルを追加することです。次に、ファイルの "Build Action"を "Content"に、 "Copy to Output Directory"を "Copy if newer"に設定します。プロジェクトをコンパイルすると、ファイルが出力ディレクトリに保存されます。

[既存項目の追加]ダイアログボックスでファイルをリンクとして追加するには、[追加]ボタンがドロップダウンとともに表示されます。 [追加]ボタンのドロップダウンから[リンクとして追加]を選択してプロセスを完了します。

+0

nice - 私の方法よりも理解しやすい人 –

+9

こんにちは、私はこの答えが好きで、自分のプロジェクトにそれを適用しようとしました。私のアプリを "公開"するとすべてうまくいくようです。あなたが言ったようにWebroot)、VS&カッシーニを介してデバッグするときではありません。代わりに私は "configSourceファイル 'db.config'を開くことができません"例外を取得します。これを行うために私が行方不明のものがありますか?ありがとう! – Funka

+13

もちろん、私が崩壊して助けを求めるコメントを投稿することを決めた直後には、それをすぐに把握することができます。私はdb.configが/ bin /フォルダにコピーされていることに気付いたので、web.configを 'configSource'にこのパスを追加するように更新しました。再度、感謝します! – Funka

2

両方の設定をmachine.configに置くことができ、それらはサーバー上のすべてのアプリケーションで使用できます。

+0

これはオプションですが、マシン上の他のアプリケーションで使用できる設定を必要としません。接続文字列は、他のアプリケーションと競合する可能性のあるかなり一般的な名前です。 –

7

あなたが任意の場所、から設定を読み込むことができますが、、それはのConfigurationManagerの静的プロパティを介して利用できなくなります。

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path) 

(multupleファイルがに、指定することができますオーバーロードがあります

静的プロパティが失われるということは、すべてのコードが異なる設定を認識する必要があることを意味します。

+0

これには、設定ファイル全体がロードされている必要があります。私はappSettingsとconnectionStringsを同じにする必要があります。ファイルの残りの部分はアプリごとに異なるので問題は解決しません。 –

+0

設定全体が通常の(静的な)プロパティによってロードされるので、これは実際の違いにはなりません。 – Richard

+0

また、独自のXML形式を使用して、その名前をアプリケーションの構成ファイルに追加して直接読み取ることもできます。 – Richard

16

それはそれがそうであるようです。 configSourceは同じフォルダ内にある必要があります。

あなたができ、私はよく分からないが、あなたはは、NTFSのハードリンクを使用する必要があります。 [狂った笑顔]

2

ベストプラクティスがわかったのは、 "共有"設定ファイルを中央ファイルに入れてから、Visual Studioで事前ビルドイベントを使用して、必要な各プロジェクトの相対フォルダにコピーすることでしたそれ。

29

の下でのappSettingsあなたは=の代わりにconfigSourceのファイルを使用することができます=私はこの問題ではかなり闘争があったが、私はここにそれのために良い解決策を見つけた

+1

優秀な私を見つける!ありがとう!!これで、http://weblogs.asp.net/pwilson/archive/2003/04/09/5261.aspxに示すように、AppSettingsの選択キーを無効にできます –

2

test run with external config

(あなたがテストの実行を指示することができます.testrunco​​nfigファイルを編集してファイルとディレクトリをテスト実行ディレクトリにコピーしてください。)

ユニットテストタイプのプロジェクトでは、自分のapp.configから設定を取得できますが、参照された設定ファイル通常のapp.configは私にはうんざりです。あなたがテストプロジェクトのアプリケーションを期待するので、私はそれをバグと呼んでいます。configは、アプリケーションのapp.configと同じように動作しますが、動作しません。

3

のVisual Studio 2015

あなたがのWeb.Configでこの問題を持っている場合は受け入れ答えが正しいですが、これは私が自分自身の顔、手のひら与えていたので、ちょうど展開する:あなたが追加

を'Add As Link'を使用してプロジェクトに.configファイルをコピーし、リンクのCopyプロパティを 'Copy If Newer'または 'Copy Always'に設定すると、物理ファイルは/ binフォルダにコピーされます。

したがって、あなたがこのようなのWeb.Configで定義されているconfigセクションがある場合:

<section name="mySpecialConfig" type="System.Configuration.AppSettingsSection" requirePermission="false" /> 

を、あなたはこのような関連config要素を定義する必要があります。

<mySpecialConfig configSource="bin\MySpecialConfig.config"> 
    </mySpecialConfig> 

なconfigSourceポイントその物理bin \ MySpecialConfig.configファイルへのリンクまた、パスはの相対物理パスであることに注意してください。

これはあまりにも明白だと思われるかもしれませんが、物理ファイルがまだ\ binフォルダにない前にこれをやっていないとすぐにクリックできないことがあります。

2

接続文字列の場合、実際には共有ファイルをポイントすることができます。共有ファイルがネットワークUNC上にある場合は、そのアプリケーションがホストされるマシンの管理者権限が必要です。

解決方法:web.configで、configSourceを使用してローカル設定ファイルを指定します。 .Netの制限のため、これはルート設定ファイルのレベル以下でなければなりません。共有接続文字列を含む設定ファイルを追加し、アプリケーションプールのユーザーがアクセスできる共有の場所に

<connectionStrings configSource="ConnectionStrings.config" /> 

:私はちょうどappフォルダ自体にファイルを指します。このファイルにはconnectionStringsセクション以外のxmlは含まれていてはなりません。共有ファイルConnectionStrings.configは、次のようになります。

<connectionStrings> 
    <clear/> 
    <add name="connString1" connectionString="connString1 info goes here"/> 
    <add name="connString2" connectionString="connString2 info goes here"/> 
</connectionStrings> 

今やトリックです。外部の共有設定ファイルを指す、Windowsのシンボリックリンクをアプリケーションフォルダに作成します。これを行うには、管理者特権が必要です。

mklink ConnectionStrings.config \\someServer\someShare\someFolder\ConnectionStrings.config 

私たちはちょうどoutsmarted .Netです。 ConfigurationシステムはconfigSource設定を使用して、ConnectionStrings.configというローカルファイル内の接続文字列を検索します。シンボリックリンクは.Netへのファイルのように見え、シンボリックリンクは共有構成ファイルに解決されます。

警告:共有ファイルを変更しても、自動的に.Netでアプリが再起動されるわけではありません。 IISの場合は、Webサイトまたはアプリケーションプールを手動で再起動する必要があります。

シンボリックリンクを作成するための管理者特権が必要なため、この方法はすべてのユーザーにとって機能しない可能性があります。共有ファイルが同じ論理ドライブ(ハードリンクとジャンクション)にある場合には、2つの関連する選択肢があります。詳細については、this discussionおよびthis discussionを参照してください。

関連する問題