【问题标题】:Dynamic session state provider动态会话状态提供程序
【发布时间】:2013-07-21 00:58:56
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您可以使用 Web Config 转换来执行此操作。您将拥有一个用于调试模式构建的配置和一个用于发布构建的配置。我们在这里执行此操作的方式是,我们有一个 Web.Base.Config,其中包含存储在 Web 中的唯一位的大部分内容和占位符.Dev.Config 和 Web.Release.Config.
  • msdn.microsoft.com/en-us/library/dd465326.aspx - 使用 Visual Studio 部署 Web 项目的 Web.config 转换语法
  • 谢谢杰米。我现在正在使用 web.config 转换。请回答,以便我接受。

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


【解决方案1】:

您可以使用 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 转换是您可以设置的更广泛设置组的一部分 可以配置为自动化部署过程。有关信息 关于设置自动部署所涉及的任务, 请参阅以下主题:

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-23
      • 2011-06-09
      • 2015-03-10
      • 2011-11-19
      • 1970-01-01
      • 2013-08-26
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多