как я могу получить идентификаторы всех текущих сеансов?
Получить идентификатор сеанса в ASP.Net
Ответ 1
Чтобы получить идентификатор сеанса, сделайте следующее:
// In a user control or page
string sessionId = this.Session.SessionID;
// In a normal class, running in a asp.net app.
string sessionId = System.Web.HttpContext.Current.Session.SessionID;
Вам не нужно:
- Сделайте любую таблицу данных или петлю что-нибудь
- Использовать SQL-сервер для состояния сеанса
- Обработать Session_Start или Session_End
В сценарии cookieless идентификатор сеанса создается при первом доступе к объекту Session. Это не имеет большого значения, потому что, как только вы получаете доступ к свойству SessionID, к объекту сеанса обращаются.
Для получения дополнительной информации ознакомьтесь с этим:
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx
Примечание. Примеры msdn были написаны обезьянами.
Ответ 2
Вы можете использовать файл Global.asax
и установить сеанс в Session_Start
. См. Ниже
в файле Global.asax
вы можете сделать что-то вроде этого:
protected void Session_Start(object sender, EventArgs e)
{
Session["sid"] = Session.SessionID;
Session["sid"] = "Test";
}
Затем в вашем WebForm вы можете получить идентификатор сеанса и значение, как показано ниже
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Session ID is:" + Session.SessionID.ToString()+ "<br/>");
Response.Write("Session value is:" + Session["sid"].ToString());
}
Подробнее см. http://www.dotnetcurry.com/ShowArticle.aspx?ID=126
Ответ 3
В соответствии с Dino Esposito каждый сеанс хранится в кэш приложения и с некоторой работой вы можете получить эту информацию:
DataTable dt = new DataTable();
dt.Columns.Add("SessionID", typeof(string));
foreach(DictionaryEntry elem in Cache) {
string s = elem.Key.ToString();
if (s.StartsWith("System.Web.SessionState.SessionStateItem")) {
DataRow row = dt.NewRow();
char[] parms = {':'};
string[] a = s.Split(parms);
row["SessionID"] = a[1];
dt.Rows.Add(row);
}
}
Ответ 4
Ответ частично зависит от того, где вы храните состояние сеанса. Предполагая, что вы используете по умолчанию (inproc), вы можете поддерживать список текущих идентификаторов сеанса с помощью событий Session_Start
и Session_End
в global.asax.
Ответ 5
Если вы сохраняете состояние сеанса в SQL Server, вы также можете легко получить его оттуда.
Ответ 6
Если вы хотите сохранить список текущих сеансов, в которых вы управляете хранилищем резервных копий, чтобы вы могли хранить дополнительные данные о клиенте, вы можете использовать список. (Я пишу следующий пример из верхней части головы)
Захватите в Application_SessionStart файл global.asax.cs:
static List<string> sessions = new List<string>();
static object sessionLock = new object();
void Application_SessionStart()
{
lock (sessionLock) {
sessions.Add(Session.SessionID);
}
}
void Application_SessionEnd()
{
lock (sessionLock) {
sessions.Remove(Session.SessionID);
}
}
В качестве альтернативы вы можете использовать словарь, сохраняя идентификатор сеанса в качестве ключа и дополнительные данные об этом пользователе в качестве значения. Затем вы можете легко создать страницу, отображающую все текущие пользовательские сеансы, например, для сайта администратора, чтобы показывать текущие сеансы пользователя.
SessionEnd будет вызываться только в том случае, если ваши сеансы являются InProc.