Вы можете собирать данные о сессиях в событиях global.asax Session_Start и Session_End (только в настройках внутри процесса):
private static readonly List<string> _sessions = new List<string>();
private static readonly object padlock = new object();
public static List<string> Sessions
{
get
{
return _sessions;
}
}
protected void Session_Start(object sender, EventArgs e)
{
lock (padlock)
{
_sessions.Add(Session.SessionID);
}
}
protected void Session_End(object sender, EventArgs e)
{
lock (padlock)
{
_sessions.Remove(Session.SessionID);
}
}
Вы должны рассмотреть возможность использования некоторых параллельных коллекций, чтобы снизить накладные расходы на синхронизацию. ConcurrentBag или ConcurrentDictionary. Или ImmutableList
https://msdn.microsoft.com/en-us/library/dd997373 (v = vs.110) .aspx
Насколько мне известно, со стандартными сеансами в памяти это невозможно. Это то, с чем я боролся на прошлой неделе, и пришел к выводу, что это невозможно, если вы не используете сервер состояния сеанса. Если вы спросите меня, это выглядит довольно странно с точки зрения дизайна. : /
Попробуйте ввести следующий код
for (int i = 0; i < Session.Keys.Count - 1; i++)
{
Label1.Text += Session.Keys.Get(i) + " - " + Session[i].ToString()+"<br/>";
}