Подтвердить что ты не робот

Настройка состояния сеанса ASP.NET во время выполнения

У нас есть веб-сайт ASP.NET, который использует состояние сеанса SQL Server. Состояние сконфигурировано в 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?

4b9b3361

Ответ 1

Как оказалось, это был довольно простой способ сделать это. Состояние сеанса предоставляет функцию, называемую Partitioning, где вы можете распространять свое состояние по нескольким SQL-серверам. Вы можете предоставить функцию для выбора SQL Server на основе идентификатора сеанса (SID). Фокус в том, что вы можете использовать эту функцию с ОДНОМ сервером, просто чтобы выбрать сервер динамически.

Конфигурация 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 для производства и разработки.

Ответ 2

Как уже упоминалось выше, я думаю, что в web.config не должно быть строк dev и prod соединений. Вы можете использовать проект веб-развертывания, чтобы решить эту проблему. Вы можете использовать проект веб-развертывания для замены своих настроек конфигурации на основе сборки. Например, у вас могут быть два внешних файла конфигурации, называемые 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

В соответствии с этой статьей вы можете настроить поставщика состояния сеанса:

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

Информация здесь может быть использована для создания поставщика состояния сеанса, ориентированного на окружающую среду, который может выбрать строку соединения на основе конфигурации в файле .config или другом экологическом ключе.