Переключение баз данных 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 и все еще сохраняет старый сеанс.
Есть ли какая-то причина, по которой вы бы не рассматривали запуск (я предполагаю, один и тот же код) как три отдельных веб-приложения?
- одна ошибка не сносит все три сайта
- состояние сеанса разделяется приложением
- позволяет масштабировать способности сайтов могут быть выделены для разных систем, как диктует рост