在运行时配置ASP.NET会话状态

22

我们有一个使用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ô
@GôTô:是的,所有环境的信息都在一个配置文件中。我在这里处理一个相对较旧的系统,我的工作是将其从进程内状态切换到 SQL Server 状态。 - Andomar
1
这是一个一般而言不错的问题,但我不喜欢把所有连接字符串放在一个地方。这样会有太多机会让生产环境写入开发环境或反之亦然... - D'Arcy Rittich
@RedFilter 我完全同意。我以前曾在尝试从同一位置引用生产和开发环境的情况下工作过,很容易搞砸事情。 - Andy
3个回答

22

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

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文件来同时适用于生产环境和开发环境。


3
如上所述,我认为您不应该在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

1

我得重新实现 SQL Session State 提供程序?哎呀 - Andomar
你不想完全重新实现它。你想尝试在现有的SQL会话提供程序上添加一个自定义的SQL连接字符串发现机制。 - Dave Swersky
但是现有的SQL会话提供程序使用Web.config中的连接字符串。那么我该如何重用它呢? - Andomar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接