【问题标题】:ASPNET : Switch between Session State Providers ?‏ASPNET:在会话状态提供者之间切换?
【发布时间】:2016-04-01 17:45:54
【问题描述】:

我想开发一个新的自定义会话状态提供程序或使用现有的(分布式缓存、sql ...)。我们的主网站每天的访问量超过 10 000 000 次。在出现错误或性能下降的情况下,提供简单的回滚/切换对我们来说非常重要。更改 web.config 不是最优的,因为我们有超过 20 台前端服务器。我们的想法是通过数据库中的简单配置在会话提供者(从我们的自定义到 InProc)之间切换。

是否可以有多个会话状态提供者或在提供者之间轻松切换?

我在这里找到了http://netpl.blogspot.fr/2007/06/wrapped-inprocsessionstatestore.html,这是一个具有通用包装器的解决方案,但它似乎不太健壮。

谢谢,

【问题讨论】:

  • 我不确定,为什么您认为链接解决方案不可靠。此外,作为后备方案,您不应回退到 InProc,因为您的 Web 应用程序部署在 Web 场(20 个前端服务器)中

标签: asp.net session-state


【解决方案1】:

仅供参考,无法动态更改会话状态提供程序。

【讨论】:

    【解决方案2】:

    这不是.. 完全正确.. 你可以使用反射来做到这一点:

    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);
    

    参考:
    Dynamic session state provider
    http://www.answerandquestion.net/questions/4447903/dynamic-session-state-provider

    【讨论】:

      猜你喜欢
      • 2011-11-19
      • 2015-09-08
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2012-08-23
      相关资源
      最近更新 更多