20

Asp.Net アプリケーションで実行時に ConfigurationManager によって返される ConnectionStringCollection に接続文字列を追加する方法はありますか?

次のことを試しましたが、構成ファイルが読み取り専用であると言われました。

ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));

実行時にこれを行う別の方法はありますか? 設計時に接続文字列を web.config に追加できることはわかっています。ただし、実行時にそのコレクションに何かを追加しようとしています。

ありがとう

編集:私がこれをやろうとしている理由の 1 つは、web.config に (暗号化されていても) ConnectionStrings を配置できないというセキュリティ要件によるものです。プロジェクトでメンバーシップやプロファイルなどの要素を使用したいと考えています。ただし、カスタムプロバイダーを作成せずにそのようなことを行う代わりの方法を検討しています。カスタム プロバイダーはそれほど悪くはありませんが、より簡単な解決策が見つかれば、私はそれで十分です。

4

8 に答える 8

35

リフレクションを使用して、プライベートbReadOnlyフィールドを無効にすることができます(悪い考えなど)。

typeof(ConfigurationElementCollection)
    .GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic)
    .SetValue(ConfigurationManager.ConnectionStrings, false);
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings());

これは、既存の接続文字列を変更するために必要な手法に似ており、BrianRodgersによってコメントとして追加されています。

于 2011-12-13T18:29:41.697 に答える
11
var cfg = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(@"/");
cfg.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings(params));

cfg.Save();

これにより、構成ファイルが変更されるため、Web サイトがリサイクルされることに注意してください。http://msdn.microsoft.com/en-us/library/4c2kcht0(VS.80).aspxを確認してください。

于 2008-12-10T20:49:54.487 に答える
10

web.configに接続文字列を配置できないという「セキュリティ要件」を与えた人を指摘するのはばかです。web.configには、アプリケーションまたはサーバーへのリモートアクセス以外からアクセスすることはできません。

これは完全に要件の問題のように聞こえるので、そこで解決する必要があります。

于 2008-12-10T21:01:28.567 に答える
4

実行時に web.config の接続文字列を編集しようとしている場合は、WebConfigurationManagerを見てください。

接続文字列を挿入するために実行時に構成を変更しようとしているだけの場合は、うまくいきません。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 のようなものを使用することもできます。

于 2008-12-10T20:47:32.197 に答える
2

まだ試していませんが、実行時に既存の接続文字列の値を変更できる可能性がありますか?たとえば、次の代わりに:

ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));

多分あなたは次のようなことをすることができます:

ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString = "something";

その場合、configで接続文字列「変数」を指定できますが、それらをfalseまたは空の接続文字列に設定します。

<add name="myconnection" connectionString="SET AT RUNTIME" ... />
于 2008-12-10T20:56:39.590 に答える
1

構成インフラストラクチャは、マシン固有のキーを使用して構成セクションを暗号化する Windows DataProtection API による非常に堅牢な暗号化をサポートしています。この方法では、暗号化されたマシン以外の場所で暗号化されたデータを読み取ることはできません。

これは、Windows で政府準拠のドライブ/フォルダーの暗号化に使用されるものと同じ API です。これはあなたの会社のセキュリティ要件に耐えられるでしょうか?

手動またはデプロイの自動化により、このコマンドを実行して、特定の Web アプリケーションの web.config の connectionStrings セクションを暗号化できます。

aspnet_regiis -pe "connectionStrings" -app "/MyCoolWebApplication" -prov "DataProtectionConfigurationProvider"
于 2008-12-11T01:54:28.957 に答える
1

MS SQL を使用している場合は、Windows 認証を介して SQL Server にアクセスするように Web サーバーを構成できます。そのため、Webconfig にパスワードを設定する必要はまったくなく、アプリケーション メモリ内に浮遊することさえありません。

于 2008-12-11T02:00:53.047 に答える
-1

いいえ、実行時に構成ファイルを変更することはできません。そのためのものではありません。たぶん、エンタープライズライブラリ構成を使用してそれを行うことができます。

于 2008-12-10T20:31:31.730 に答える