0

Web ページの読み込み時にセッション状態プロバイダーを動的に変更したいと考えています。

ローカルでは、開発中に以下を使用します。

<sessionState mode="InProc" />

しかし、本番コードは次のように実行されます。

<sessionState mode="Custom" customProvider="CustomSessionStateProvider">
  <providers>
    <add name="CustomSessionStateProvider" type="Library.CustomSessionStateProvider" applicationName="AppName" />
  </providers>
</sessionState>

ページが読み込まれる前に、実行時に sessionState が使用するプロバイダーを変更することはできませんか? ある種の構成可能な項目によって決定されます。

if(Environmental.IsProduction)
{
    // Use custom provider
}
else
{
    // Use InProc
}

環境ごとに異なる設定ファイルを使用していますが、この機能はすべての環境で利用できる必要があります。

4

2 に答える 2

2

これを実現するには、Web Config Transformations を使用できます。

これにより、web.config で変換セクションを指定し、ビルド中に変換トークンを置き換えるさまざまな環境用の個別のファイルを持つことができます。

詳細はこちら: http://msdn.microsoft.com/en-us/library/dd465318%28v=vs.100%29.aspx

Web サイトを展開するとき、展開されたアプリケーションの Web.config ファイルの一部の設定を、開発用の Web.config ファイルとは異なるものにしたいことがよくあります。たとえば、デバッグ オプションを無効にし、接続文字列を変更して、別のデータベースを指すようにすることができます。このトピックでは、配置されたバージョンの Web.config ファイルを変更するために、配置中に自動的に適用される Web.config 変換ファイルを設定する方法について説明します。

Web.config 変換は、展開プロセスを自動化するために構成できる、より広範な設定グループの一部です。自動展開の設定に関連するタスクについては、次のトピックを参照してください。

于 2013-07-25T12:32:50.297 に答える
2

リフレクションを使用してこれを実現できます。

protected void Application_Start() {
    var privateFieldFlags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic;

    //Get session state section
    var sessionStateSection = ConfigurationManager.GetSection("system.web/sessionState") as SessionStateSection;
    var values = typeof(ConfigurationElement).GetField("_values", privateFieldFlags).GetValue(sessionStateSection);
    var entriesArray = values.GetType().BaseType.GetField("_entriesArray", privateFieldFlags).GetValue(values);

    //Get "Mode" entry (index: 2)
    var modeEntry = (entriesArray as System.Collections.ArrayList)[2];
    var entryValue = modeEntry.GetType().GetField("Value", privateFieldFlags).GetValue(modeEntry);

    //Change entry value to InProc
    entryValue.GetType()
            .GetField("Value", privateFieldFlags)
            .SetValue(entryValue, System.Web.SessionState.SessionStateMode.InProc);
}
于 2013-08-26T20:31:54.217 に答える