动态会话状态提供者

时间:2013-07-22 10:20:56

标签: c# asp.net caching web-config session-state

我希望在加载网页时动态更改会话状态提供程序。

在本地,在开发过程中,我们使用以下内容:

<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
}

我们确实为每个环境使用不同的配置文件,但此功能需要在所有环境中都可用。

2 个答案:

答案 0 :(得分:2)

您可以使用Web Config Transformations来实现此目的。

这将允许您在web.config中指定转换部分,并为构建期间替换转换令牌的不同环境分配文件。

此处有更多信息:http://msdn.microsoft.com/en-us/library/dd465318%28v=vs.100%29.aspx

  

部署网站时,通常需要一些设置   部署应用程序的Web.config文件不同于   开发Web.config文件。例如,您可能想要禁用   调试选项并更改连接字符串以便它们指向   不同的数据库本主题说明如何设置Web.config   部署期间自动应用的转换文件   为了对已部署的Web.config文件版本进行更改。

     

Web.config转换是您的更广泛设置组的一部分   可以配置为自动化部署过程。有关信息   关于设置自动部署所涉及的任务,   请参阅以下主题:

答案 1 :(得分:2)

您可以使用Reflection:

实现此目的
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);
}