Управление сеансом в ASP .NET

Просто возник вопрос об управлении сеансом в ASP .NET. Я рассмотрел 3 варианта в IIS (InProc, StateServer и SQL Server), и у меня возникли проблемы с развертыванием сохраняемости сеанса на нескольких серверах и в нескольких веб-приложениях. Есть ли какие-либо другие варианты, которые доступны для управления сеансами между субдоменами (от одного и того же родителя), а также для нескольких веб-приложений в каждом домене?

Приведу пример: представьте себе сайт www.thisismysite.com.au. Когда я вхожу в систему, я захожу на login.thisismysite.com.au. просматривая сайт, я захожу на www.thisismysite.com.au/MyWebApp/. Я пытаюсь добиться, чтобы сеанс сохранялся по всем трем ссылкам. Мне известен один сторонний инструмент, который может это сделать, Groat SessionFarm, но мне интересно, есть ли другие инструменты? Кроме того, существует сочетание SSL / не SSL, если это имеет значение.

Примечание. Меня не беспокоит идентичность, я мог бы реализовать Windows Identity Foundation (или что-то подобное) и отправлять заявки во все три места. Я после сеанса настойчивость.

Большое спасибо, Ли

РЕДАКТИРОВАТЬ: В итоге я выбрал сторонний фрагмент кода, который мы могли настроить для наших целей. Работает отлично, и, купив исходный код, мы можем обновлять его по мере необходимости.


person lkoutzas    schedule 08.08.2011    source источник


Ответы (5)


Сервер состояний или хранилище в SQL Server должны нормально работать для того, что вы пытаетесь сделать, даже в нескольких приложениях, но вы должны помнить, что все приложения должны иметь один и тот же MachineKey.

ASPNET-load -balancing-and-ASPNET-state-server

HTH

person A Rogers    schedule 21.02.2012

Похоже, вам может понадобиться распределенное кеширование?

В этом сообщении вы можете найти несколько вариантов - Распределенное решение для кеширования / сеанса для веб-приложения ASP.NET

Я немного новичок в этой области, но я работаю над использованием Microsoft Azure AppFabric Caching для состояния сеанса в моем текущем проекте MVC / ASP.NET, поскольку веб-приложения Azure по своей сути не предоставляют хороших вариантов для состояния сеанса.

Я считаю, что ссылки в упомянутом выше сообщении похожи на кэширование Azure AppFabric и также могут обрабатывать состояние сеанса. Однако я не работал ни с одним из них, поэтому не могу поручиться за надежность. Я просто начинаю работать над этим аспектом в моем собственном приложении на этих выходных.

Грег

person Gregory Thomson    schedule 08.08.2011
comment
Я посмотрел на Azure AppFabric и, насколько я могу судить, он работает как более крупная версия StateServer, что означает, что я не могу совместно использовать сеансы в разных веб-приложениях (субдомене или субприложении). Однако он будет работать для одного и того же сайта / приложения на нескольких серверах. - person lkoutzas; 08.08.2011

Один из вариантов - управлять состоянием сеанса через SQL Server, или вы можете изучить что-то вроде NCache для управления состоянием на нескольких серверах.

person James Johnson    schedule 08.08.2011
comment
да, но это не работает с несколькими приложениями (суб веб-приложениями или субдоменами) - person lkoutzas; 09.08.2011

Государственный сервер или SQL-сервер должны работать. По крайней мере, для http. Запрос Https, возможно, должен заканчиваться на том же IP ... Не уверен в этом.

вы также можете использовать аппаратный балансировщик нагрузки / переключатель, который поддерживает сеансы. Они отправляют первоначальный запрос от пользователя на сервер, а следующие запросы от этого пользователя всегда отправляются на тот же сервер. (или они пытаются)

Это для совместного использования сеансов только для одного веб-приложения, но для обмена сеансами между приложениями то, что я делаю на своей работе, - это использование классических сеансов asp (для устаревшей поддержки, но asp.net тоже действителен), когда пользователь входит в систему, они созданы в asp, и они читают из файла с именем sessions.asp (имя не имеет значения), этот файл возвращает значения при вызове из .net, выполняющего веб-запрос.

Например: sessions.asp? Session_name = username вызывается из любого локального приложения .net и отвечает "John", поэтому "John" находится внутри session ["session_name"] и sessions.asp (или aspx, php или чего угодно) просто пишет текст в ответ.

Я не уверен, ясно ли это объяснено ... Это грязный и простой способ сделать это. В моей компании мы используем его примерно для 300 одновременных пользователей, каждый из которых имеет кучу сеансов, и, похоже, он работает довольно хорошо. Надеюсь, поможет. ;-)

person H27studio    schedule 05.01.2012

Один из простых способов обработки нескольких веб-приложений с использованием кеша вместо сеанса.

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

int timeout=20;
string key= userid+System.Web.HttpContext.CurrentRequest.ServerVariables("REMOTE_ADDR");

//Set 
Cache.Insert(key, value, null,  DateTime.Now.AddMinutes(timeout), Cache.NoSlidingExpiration);    

//Get
var value=Cache[key];

При выходе из системы не забываем удалить кеш

Cache.Remove(key);
person Shahdat    schedule 05.01.2012