アプリケーションディレクトリフォルダ外の.NET構成ファイルconfigSource


82

コンソールアプリケーションとASP.NETアプリの2つのアプリケーションがあります。どちらも同じappSettingsとconnectionStringsを知っている必要があります。したがって、理想的には、app.config / web.configファイルのconfigSourceプロパティを使用して、中央の場所を指すようにします。例えば

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

ただし、エラーで失敗します。

configSource属性が無効です。:configSource'D:\ appSettings.config 'が無効です。構成ファイルと同じディレクトリまたはサブディレクトリにあるファイルを参照する必要があります。

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

回答:


103

もう1つの解決策は、実際にファイルをプロジェクトにコピーするのではなく、すべてのプロジェクトに構成ファイルをリンクとして追加することです。次に、ファイルの「ビルドアクション」を「コンテンツ」に設定し、「出力ディレクトリにコピー」を「新しい場合はコピー」に設定します。プロジェクトをコンパイルすると、ファイルは出力ディレクトリにあります。

[既存のアイテムを追加]ダイアログボックスでファイルをリンクとして追加するには、ドロップダウン付きの[追加]ボタンがあります。[追加]ボタンのドロップダウンから[リンクとして追加]を選択して、プロセスを完了します。


いい-私のやり方よりも人々が理解しやすい
ロバートマクリーン

10
こんにちは、私はこの答えが好きで、自分のプロジェクトに適用しようとしました。アプリを「公開」すると(db.configはあなたが言ったようにwebrootにコピーされます)、すべてが正常に機能するようですが、VSを介してデバッグするときはそうではありません&カッシーニ。代わりに、「configSourceファイル 'db.config'を開くことができません」という例外が発生します。これを行うために私が欠けているものはありますか?ありがとう!
funka 2010年

16
もちろん、私が分解して助けを求めるコメントを投稿することを決めた直後にのみ、私はそれをすぐに理解します。db.config/ bin /フォルダーにコピーされていることに気付いたので、web.configを更新して、このパスの先頭に追加しましたconfigSource。すべて問題ないようです。再度、感謝します!
funka 2010年

1
@ Funka-db.configの「BuildAction」プロパティがデフォルトのweb.configのように「Content」ではなく「None」に設定されているため、問題が発生していないかどうかを確認します。設定は「ビルドアクション」=「コンテンツ」および「出力ディレクトリにコピー」=「コピーしない」である必要があると思います。
bopapa_1979 2013

1
VS 2013でデバッグする場合、これは機能していないようです。Ericsソリューションを試しましたが、これも機能しませんでした。
クリスネビル2014


16

そういう風に思えます。configSourceは、同じフォルダーまたはそれより深いフォルダーにある必要があります。

あなたは可能性があり、私はわからないが、あなたがすべき、NTFSのハードリンクを使用しています。[マッドニヤリ]


10

Visual Studio 2015

Web.Configでこの問題が発生している場合、受け入れられた答えは正しいですが、これにより私は自分自身に顔をしかめることができたので、拡張するだけです。

「リンクとして追加」を使用してプロジェクトに.configファイルを追加し、リンクの「コピー」プロパティを「新しい場合にコピー」または「常にコピー」に設定すると、物理ファイルが/ binフォルダーにコピーされます。

したがって、Web.Configで次のように構成セクションが定義されている場合:

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

次に、関連する構成要素を次のように定義する必要があります。

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

configSourceがリンクではなく物理bin \ MySpecialConfig.configファイルを指すようにします。 また、パスは相対的な物理パスであることに注意してください。

これはばかげているように思えるかもしれませんが、物理ファイルがまだ\ binフォルダーにない前にこれを行っていない場合は、すぐにクリックされない可能性があります。


8

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

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(デフォルト/ユーザーローミング/ユーザーローカル階層をサポートするために、複数のファイルを指定できるオーバーロードがあります。)

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


これには、構成ファイル全体をロードする必要があります。appSettingsとconnectionStringsが同じである必要があるだけです。ファイルの残りの部分はアプリごとに異なるため、問題は解決しません。
ロバートマクリーン

とにかく、構成全体が通常の(静的)プロパティによってロードされるため、これは実際の違いにはなりません。
リチャード

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

5

接続文字列の場合、共有ファイルを指すことは確かに可能です。共有ファイルがネットワークUNC上にある場合は、アプリがホストされるマシンの管理者権限が必要です。

解決策:web.configで、configSourceを使用してローカル構成ファイルをポイントします。.Netの制限により、これはルート構成ファイルのレベル以下である必要があります。アプリフォルダー自体のファイルをポイントするだけです。

<connectionStrings configSource="ConnectionStrings.config" />

アプリケーションプールユーザーがアクセスできる共有の場所に、共有接続文字列を含む構成ファイルを追加します。このファイルには、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

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

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

シンボリックリンクを作成するには管理者権限が必要なため、このアプローチはすべての人に役立つとは限りません。共有ファイルが同じ論理ドライブ上にある場合に機能する可能性のある2つの関連する代替手段があります-ハードリンクとジャンクション。詳細については、このディスカッションおよびこのディスカッションを参照してください。


3

両方の設定をに配置できます machine.configに配置すると、サーバー上のすべてのアプリケーションで使用できるようになります。


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

2

私が最もうまく機能した解決策は、「共有」構成ファイルを中央ファイルに配置し、Visual Studioでビルド前のイベントを使用して、それを必要とする各プロジェクトの相対フォルダーにコピーすることでした。


2

私はこの問題にかなり苦労しましたが、ここでそれに対する良い解決策を見つけました:外部設定でテスト実行

(.testrunco​​nfigファイルを編集することにより、ファイルとディレクトリをテスト実行ディレクトリにコピーするようにテスト実行を指示できます。)

単体テストタイプのプロジェクトが独自のapp.configから構成設定を取得できるのに、通常のapp.configのように参照されている構成ファイルを読み込めないのは、私にはちょっと困惑します。テストプロジェクトapp.configがアプリケーションのapp.configと同じように動作することを期待するので、これをバグと呼びますが、そうではありません。


1

file代わりに属性を使用できますconfigSource

ここに良い記事があります

これにより、次のような相対パスを指定できます

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings file="..\..\..\..\..\..\ExternalFile.config"></appSettings>
</configuration>

パスは出力ディレクトリからの相対パスです。

次に、ExternalFile.configでappSettingsセクションを追加するだけです

<appSettings>
    <add key="SomeKey" value="alue"/>
</appSettings>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.