【问题标题】:Configure ASP.NET Session State at runtime在运行时配置 ASP.NET 会话状态
【发布时间】:2011-04-27 12:56:41
【问题描述】:

我们有一个使用 SQL Server 会话状态的 ASP.NET 网站。状态在Web.config中配置如:

<sessionState mode="SQLServer" sqlConnectionString="data source=TheServer;
    User ID=TheUser;password=ThePassword;" cookieless="false" timeout="480"/>

但是有三种环境(开发/登台/生产)。所有其他连接字符串的配置如下:

<configuration>
    <connectionStrings>
        <add name="Development_Db1" connectionString="..."/>
        <add name="Production_Db1" connectionString="..."/>
    </connectionStrings>
</configuration>

在运行时,我们根据主机名选择一个连接到数据库。不幸的是,会话状态连接字符串似乎在web.config 中硬编码。

有没有办法在运行时配置 SQL Server 会话状态,或者让它引用来自connectionStrings 部分的连接字符串?

【问题讨论】:

  • 所以基本上你在一个配置文件中拥有所有环境的信息?您不想每个环境使用一个文件吗?
  • @GôTô:是的,所有环境的所有信息都在一个配置文件中。在这里使用相对较旧的系统,我的工作是将其从进程内切换到 sqlserver 状态。
  • 总的来说,这是一个很好的问题,但我不喜欢将所有连接字符串保存在一个地方的想法。生产写入开发环境的机会太大,反之亦然......
  • @RedFilter 我完全同意。在尝试从同一个地方引用生产和开发环境之前,我已经在场景中工作过,很容易把事情搞砸。

标签: c# asp.net session-state


【解决方案1】:

根据这篇文章,你可以自定义会话状态提供者:

http://www.exforsys.com/tutorials/asp.net-2.0/asp.net-2.0-customizing-the-session-state-mechanism.html

此处的信息可用于设计环境感知会话状态提供程序,该提供程序可以根据 .config 文件中的配置或其他环境键选择连接字符串。

【讨论】:

  • 我必须重新实现 SQL 会话状态提供程序吗?哎哟
  • 你不会想要完全重新实现它。您可能想尝试在现有的 SQL 会话提供程序上分层自定义 SQL 连接字符串发现机制。
  • 但是现有的 SQL 会话提供程序使用来自Web.config 的连接字符串。那我怎么能重复使用呢?
【解决方案2】:

如上所述,我认为您不应该在 web.config 中同时包含 dev 和 prod 连接字符串。您可以使用 Web 部署项目来解决该问题。您可以使用 Web 部署项目来替换基于构建的配置设置。例如,您可以有两个名为 connectionStrings.dev.config 和 connectionStrings.prod.config 的外部配置文件。如果您在 Debug 中构建,它将使用 dev.config,但如果您在 Release 中构建,它将使用 prod.config。

与 VS 08 和 10 有点不同。这里有一些参考:

VS 2008 - http://johnnycoder.com/blog/2010/01/07/deploy-aspnet-web-applications-with-web-deployment-projects/

VS 2010 - http://www.hanselman.com/blog/WebDeploymentMadeAwesomeIfYoureUsingXCopyYoureDoingItWrong.aspx

【讨论】:

    【解决方案3】:

    事实证明,有一种相当简单的方法可以做到这一点。会话状态提供了一个名为Partitioning 的功能,您可以在其中将您的状态分散到多个 SQL Server 上。您可以提供一个函数来根据会话 ID (SID) 选择 SQL Server。诀窍是您可以将此功能与 ONE 服务器一起使用,只需动态选择服务器。

    web.config 配置如下:

    <sessionState mode="SQLServer" 
                  partitionResolverType="YourNamespace.PartitionResolver" 
                  cookieless="false" 
                  timeout="60" />
    

    选择 SQL Server 的函数如下所示:

    public class PartitionResolver : IPartitionResolver
    {
        public void Initialize() {}
    
        // The key is a SID (session identifier)
        public String ResolvePartition(Object key)
        {
            return <grab your config here>;
        }
    }
    

    这种方法使我们能够继续使用一个 web.config 进行生产和开发。

    【讨论】:

      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 2015-11-28
      • 2011-06-07
      • 2010-11-02
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多