0

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

在本地,在开发时,我们使用以下内容:

<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.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 回答