Настроить состояние сеанса 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?


person Andomar    schedule 19.10.2010    source источник
comment
Итак, в основном у вас есть информация обо всех средах в одном файле конфигурации? Вы не хотите использовать один файл для каждой среды?   -  person GôTô    schedule 19.10.2010
comment
@ GôTô: Да, вся информация для всех сред находится в одном файле конфигурации. Работая здесь над относительно старой системой, моя задача - переключить ее из текущего состояния в состояние sqlserver.   -  person Andomar    schedule 19.10.2010
comment
В целом это хороший вопрос, но мне не нравится идея хранить все строки подключения в одном месте. Слишком велика вероятность того, что продакшн пишет в среду разработки или наоборот ...   -  person D'Arcy Rittich    schedule 19.10.2010
comment
@RedFilter Полностью согласен. Я работал со сценариями, прежде чем пытаться ссылаться на производственную среду и среду разработки из одного и того же места, и это легко испортить.   -  person Andy    schedule 19.10.2010


Ответы (3)


Как оказалось, это был довольно простой способ. Состояние сеанса предоставляет функцию под названием Разделение, где вы можете распределить свое состояние по нескольким 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 как для производства, так и для разработки.

person Andomar    schedule 23.01.2011

Как упоминалось выше, я считаю, что в файле 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" rel="nofollow"> http://www.hanselman.com/blog/WebDeploymentMadeAwesomeIfYoureUsing

person Tyson Nero    schedule 19.10.2010

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

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

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

person Dave Swersky    schedule 19.10.2010
comment
Мне пришлось бы заново реализовать поставщика состояния сеанса SQL? Ой - person Andomar; 20.10.2010
comment
Вы бы не захотели полностью реализовать его заново. Вы можете попробовать наложить настраиваемый механизм обнаружения строки подключения SQL поверх существующего поставщика сеанса SQL. - person Dave Swersky; 20.10.2010
comment
Но существующий поставщик сеанса SQL использует строку подключения из Web.config. Итак, как я могу использовать это повторно? - person Andomar; 21.10.2010