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

时间:2010-10-19 14:40:23

标签: c# asp.net session-state

我们有一个使用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部分的连接字符串?

3 个答案:

答案 0 :(得分:20)

事实证明,有一种相当简单的方法可以做到这一点。会话状态提供了一个名为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进行生产和开发。

答案 1 :(得分: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

答案 2 :(得分:1)

根据这篇文章,您可以自定义会话状态提供程序:

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

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