実行時に ConnectionStringCollection に ConnectionString を追加できますか?
-
21-08-2019 - |
質問
Asp.Net アプリケーションの実行時に ConfigurationManager によって返される ConnectionStringCollection に接続文字列を追加する方法はありますか?
次のことを試しましたが、構成ファイルが読み取り専用であると言われます。
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));
実行時にこれを行う別の方法はありますか?設計時に web.config に接続文字列を追加できることはわかっています。ただし、実行時にそのコレクションに何かを追加したいと考えています。
ありがとう
編集:これを行おうとする理由の 1 つは、セキュリティ要件により、web.config に ConnectionStrings を (暗号化されていても) 配置できないためです。プロジェクトでメンバーシップやプロフィールなどの要素を使用したいと考えています。ただし、カスタムプロバイダーを作成せずにそのようなことを行う代わりの方法を検討しています。カスタム プロバイダーはそれほど悪いものではありませんが、もっと簡単な解決策が見つかるのであれば、私は大歓迎です。
解決
var cfg = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(@"/");
cfg.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings(params));
cfg.Save();
これは、それが設定ファイルを変更しますので、あなたのウェブサイトはリサイクルするようになりますアドバイスされます。チェックアウト http://msdn.microsoft.com/en -us /ライブラリ/ 4c2kcht0(VS.80).aspxのの
他のヒント
あなたはプライベートbReadOnlyフィールド無効にするには、リフレクションを使用することができます(悪いアイデアなどを。):
typeof(ConfigurationElementCollection)
.GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic)
.SetValue(ConfigurationManager.ConnectionStrings, false);
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings());
これはhref="http://david.gardiner.net.au/2008/09/programmatically-setting.html"は、既存の接続文字列を変更rel="noreferrer"> 、そしてブライアン・ロジャースによってそこにコメントとして追加します。
ただ、あなたがweb.configファイルに接続文字列を配置することはできません「のセキュリティ要件」を与えた誰でも指摘することは馬鹿です。 web.configファイルは、アプリケーションやサーバーへのリモートアクセス以外のものによってアクセスすることはできません。
これは完全に要件の問題のように聞こえるし、そこに解決しなければならない。
実行時に web.config の接続文字列を編集しようとしている場合は、以下を参照してください。 Web構成マネージャー.
接続文字列を挿入するために実行時に構成を変更しようとしているだけの場合は、運が悪いです。ConfigurationManager オブジェクト ツリーは、構成ファイルを直接反映することを目的としていますが、その状態を変更できた場合、一貫性が失われます。
接続文字列を取得するために使用できる単純なファサード クラスを作成することをお勧めします。このようにして、ファサードにオンザフライ コレクションから接続文字列を返させることができます。接続文字列が存在しない場合は、ConfigurationManager から取得することもできます。
class ConnectionStringProvider
{
Dictionary<string, System.Configuration.ConnectionStringSettings> _localStrings = new Dictionary<string, System.Configuration.ConnectionStringSettings>();
public void AddLocalConnectionString(string name, string connstring)
{
System.Configuration.ConnectionStringSettings cs = new System.Configuration.ConnectionStringSettings(name, connstring);
_localStrings.Add(name, cs);
}
public void RemoveLocalConnectionString(string name)
{
_localStrings.Remove(name);
}
public System.Configuration.ConnectionStringSettings this[string name] {
get
{
return _localStrings.ContainsKey(name) ? _localStrings[name] : System.Configuration.ConfigurationManager.ConnectionStrings[name];
}
}
}
あるいは、もっと重いものを用意して、Enterprise Library Configuration Block のようなものを使用することもできます。
まだ試していないが、おそらくあなたは、実行時に、既存の接続文字列の値を変更することができますか?たとえば、代わりに:
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));
たぶん、あなたのような何かを行うことができます:
ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString = "something";
もしそうなら、あなたはconfigに接続文字列「変数」を指定しますが、虚偽または空の接続文字列にそれらを設定することができます:
<add name="myconnection" connectionString="SET AT RUNTIME" ... />
の構成インフラストラクチャは、Windows DataProtection APIのウィッヒを通じて非常に堅牢な暗号化は、構成セクションを暗号化するために、マシンの特定のキーを使用していますサポートしています。この方法は、どこにもなく、それが暗号化されたマシン上で暗号化されたデータを読み出すことはできないだろう。
これは、Windowsでの政府の対応のドライブ/フォルダの暗号化に使用されるのと同じAPIです。これはあなたの会社のセキュリティ要件に立つでしょうか?
手動またはデプロイメント自動化により、特定のWebアプリケーションのためのあなたのweb.configファイルのconnectionStringsセクションを暗号化するために、このコマンドを実行することができます。
aspnet_regiis -pe "connectionStrings" -app "/MyCoolWebApplication" -prov "DataProtectionConfigurationProvider"
あなたは、Windows認証を経由してSQL ServerにアクセスするためにあなたのWebサーバを設定することができます。
いいえ、あなたはそれがそのために意図されていない、実行時に設定ファイルを変更することはできません。 たぶん、あなたはそれを行うためにエンタープライズライブラリの設定を使用することができます。