2013-11-15 3 views
3

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

shop1.com -> Database1 

shop2.com -> Database2 

shop3.com -> Database3 

Пока все хорошо.

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

shop1.com -> SessionStateDatabase1 

shop2.com -> SessionStateDatabase2 

shop3.com -> SessionStateDatabase3 

Заранее за вашу помощь.


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

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

ответ

1

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

+0

Спасибо @fejesjoco. Я определенно буду смотреть на нее на следующей неделе, поскольку это кажется довольно многообещающим. – Oxon

+1

Я сомневаюсь, что есть другой хороший способ сделать это, и это поддерживается и приятно. Реализация IPartitionResolver - не самая простая задача, потому что вам необходимо сопоставить идентификаторы сеанса с цепочками соединений. Поэтому, если вы хотите принять решение на основе имени домена, вам нужно каким-либо образом сопоставить имена доменов с идентификатором сеанса. Либо вы храните это сопоставление где-нибудь (в событии Global Session_Start), либо ... Самый простой трюк, который я могу придумать, - это использовать пользовательский ISessionIDManager и поместить идентификатор базы данных непосредственно в идентификатор сеанса. Поэтому, когда вы смотрите на идентификатор сеанса, вы знаете, в какой базе данных он находится. – fejesjoco

0

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

+0

Причина, по которой пользователь может перейти от shop1.com к shop2.com, вызывает проблемы. Более того, я также очень обеспокоен безопасностью данных, если пользователю удается что-то сделать в магазине2, пока он вошел в систему только на shop1. – Oxon

+0

Я уверен, что должно быть обходное решение или другой способ обработки ситуации. – Oxon

+1

Если идентификатор сеанса хранится в файле cookie, браузер не будет отправлять его для разных доменов. Так что проблем там нет. – user2970362

0

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

  • одна ошибка не снять все три участка
  • состояние сеанса отделено приложением
  • позволяет масштаб способность участков может быть отнесена к различным системам, как рост диктует
+0

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

+0

Модель с несколькими арендаторами имеет больше общего с базой данных и меньше связана с хостинговыми контейнерами для веб-сайтов, если вы считаете, что проблема сложна с парой в 50 лет, вы, вероятно, смотрите на веб-ферму, тем более, что причина переместить на несколько сайтов одну базу данных. –

Смежные вопросы