Переключение баз данных Sql Session State

У меня есть один экземпляр веб-приложения, подключенного к нескольким базам данных. На основе доменного имени (например, www.shop1.com, www.shop2.com,..) я переключаю строку подключения в Entity Framework.

shop1.com -> Database1

shop2.com -> Database2

shop3.com -> Database3

Все идет нормально.

Я также использую состояние сеанса Sql Server и хочу переключить базу данных состояния сеанса так же, как я переключаю базу данных для своих данных.

shop1.com -> SessionStateDatabase1

shop2.com -> SessionStateDatabase2

shop3.com -> SessionStateDatabase3

Заранее спасибо за помощь.


Больше информации, если вы хотите узнать, почему я это делаю:

На самом деле я реализую мультитенантность. В приведенном выше описании показаны три сайта. На самом деле у меня их больше 50. И количество сайтов будет расти в ближайшие несколько месяцев. В настоящее время все сайты развертываются отдельно, что означает, что всякий раз, когда мне нужно развернуть исправление или обновление, я развертываю все 50 сайтов. Ведение сайтов таким образом становится кошмаром. Поэтому я думал о размещении от 5 до 10 сайтов в одном экземпляре, в зависимости от их использования, чтобы у меня было меньше экземпляров для обслуживания.

3 ответа

Решение

В таких случаях я всегда смотрю на исходный код фреймворка. Сначала я выясняю, где конфигурация хранит строку подключения состояния сеанса, затем я нахожу, где она используется. Частный класс System.Web.SessionState.SqlSessionState.SqlSessionStateStore есть метод OneTimeInit()где он читает строку подключения. Здесь я заметил, что есть поддержка partiniong, см. Здесь: http://msdn.microsoft.com/en-us/library/aa478952.aspx. Я никогда не слышал об этом раньше, но похоже, что он делает именно то, что вы хотите, вы можете хранить состояние сеанса в нескольких базах данных, основываясь на любых критериях, которые вы хотите. +1 к вопросу кстати, это классная фича. Кроме того, если это не сработает, вы можете попробовать реализовать собственную реализацию SessionStateStoreProviderBase, которая является общедоступной.

Поскольку соединение с состоянием сеанса не управляется вашим кодом, вы не сможете его переключить. Это конфигурация уровня приложения и контроль над кодом. Но необходимости в этом не должно возникнуть. Один сервер сможет управлять состоянием сеанса для всех трех ваших доменов. Единственная проблема, возможно, когда пользователь переходит с shop1.com на shop2.com и все еще сохраняет старый сеанс.

Есть ли какая-то причина, по которой вы бы не рассматривали запуск (я предполагаю, один и тот же код) как три отдельных веб-приложения?

  • одна ошибка не сносит все три сайта
  • состояние сеанса разделяется приложением
  • позволяет масштабировать способности сайтов могут быть выделены для разных систем, как диктует рост
Другие вопросы по тегам