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

C# 在运行时配置ASP.NET会话状态,c#,asp.net,session-state,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"/> 但是有三种环境(开发/登台/生产)。所有其他连接字符串的配置如下

我们有一个使用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会话状态,或使其引用
连接字符串部分中的连接字符串?

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


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

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

这和第08节和第10节有点不同。以下是一些参考资料:

VS 2008-


VS 2010-

事实证明,有一种相当简单的方法可以做到这一点。会话状态提供了一个名为的功能,您可以在其中将状态分布到多个SQL Server。您可以提供一个基于会话id(SID)选择SQL Server的函数。诀窍在于,您可以在一台服务器上使用此功能,只需动态选择服务器即可

web.config
配置如下所示:

<sessionState mode="SQLServer" 
              partitionResolverType="YourNamespace.PartitionResolver" 
              cookieless="false" 
              timeout="60" />
public class PartitionResolver : IPartitionResolver
{
    public void Initialize() {}

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

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

<sessionState mode="SQLServer" 
              partitionResolverType="YourNamespace.PartitionResolver" 
              cookieless="false" 
              timeout="60" />
public class PartitionResolver : IPartitionResolver
{
    public void Initialize() {}

    // The key is a SID (session identifier)
    public String ResolvePartition(Object key)
    {
        return <grab your config here>;
    }
}
公共类分区解析器:IPartitionResolver
{
public void Initialize(){}
//密钥是SID(会话标识符)
公共字符串解析分区(对象键)
{
返回;
}
}

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

那么基本上您在一个配置文件中拥有所有环境的信息?是否不希望每个环境使用一个文件?@GôTô:是的,所有环境的所有信息都在一个配置文件中。在一个相对较旧的系统上工作,我的工作是将其从进程内状态切换到sqlserver状态。这通常是一个好问题,但我不喜欢将所有连接字符串保留在一个位置的想法。生产写入开发环境的可能性太大,反之亦然…@RedFilter我完全同意。在尝试从同一个地方引用生产和开发环境之前,我已经在场景中工作过,很容易把事情搞砸。我必须重新实现SQL会话状态提供程序?哎哟,你不想完全重新实施它。您可能希望尝试在现有SQL会话提供程序上分层自定义SQL连接字符串发现机制。但现有SQL会话提供程序使用
Web.config
中的连接字符串。那我怎么能重复使用呢?