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

And*_*mar 21 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"/>
Run Code Online (Sandbox Code Playgroud)

但是有三种环境(开发/分期/生产).所有其他连接字符串配置如下:

<configuration>
    <connectionStrings>
        <add name="Development_Db1" connectionString="..."/>
        <add name="Production_Db1" connectionString="..."/>
    </connectionStrings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*mar 20

事实证明,有一种相当简单的方法可以做到这一点.会话状态提供了一种称为分区的功能,您可以在其中将状态分布在多个SQL Server上.您可以提供基于会话ID(SID)选择SQL Server的功能.诀窍是你可以在ONE服务器上使用这个功能,只是为了动态选择服务器.

web.config配置是这样的:

<sessionState mode="SQLServer" 
              partitionResolverType="YourNamespace.PartitionResolver" 
              cookieless="false" 
              timeout="60" />
Run Code Online (Sandbox Code Playgroud)

选择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>;
    }
}
Run Code Online (Sandbox Code Playgroud)

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