Автоматический обмен сеансами между многими пользователями [ASP.NET] - PullRequest
3 голосов
/ 17 июня 2011

Я использовал собственный класс SessionWrapper для обработки Session в моем проекте ASP.NET.Кажется, все в порядке, но я недавно обнаружил, что в нем есть смешная ошибка.Если многие пользователи войдут в мой сайт, их сессия будет обменена или смешана.У пользователя A будет сеанс пользователя B, и, возможно, у пользователя C будет сеанс пользователя A. Он может измениться после обновления пользователем страницы.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections;

namespace MyNamespace
{
    public class SessionWrapper
    {
        public static string USER_SESSION = "userSession";

       public static void SetUserSession(string email, Dictionary<int, DateTime> products)
        {
            UserSession userSession = new UserSession() { Email = email, Products = products };
            System.Web.HttpContext.Current.Session.Add(USER_SESSION, userSession);
        }

        public static UserSession GetUserSession()
        {
            if (System.Web.HttpContext.Current.Session[USER_SESSION] != null)
            {
                return System.Web.HttpContext.Current.Session[USER_SESSION] as UserSession;
            }
            return null;
        }

        public static void RemoveUserSession()
        {
            if (System.Web.HttpContext.Current.Session[USER_SESSION] != null)
            {
                System.Web.HttpContext.Current.Session.Remove(USER_SESSION);
            }
        }
    }

    public class UserSession
    {
        private string email;
        private Dictionary<int, DateTime> products = new Dictionary<int, DateTime>();

        public string Email
        {
            get;
            set;
        }

        public Dictionary<int, DateTime> Products
        {
            get;
            set;
        }
    }
}

Ответы [ 5 ]

3 голосов
/ 17 июня 2011

Единственная причина, помимо какого-то странного кода в приложении, такого как Джонас Х, заметила, что вы тестируете его либо в одном экземпляре браузера на отдельных вкладках , либо в двух экземплярах одного браузера .

Попробуйте отобразить HttpContext.Current.Session.SessionID, чтобы определить, находитесь ли вы в одном сеансе во всех случаях.

0 голосов
/ 17 июня 2011

Предоставленный код должен вести себя как нужно. Если проблема действительно существует, как описано, она должна быть вызвана кодом в другом месте приложения.

0 голосов
/ 17 июня 2011

Это «статический» модификатор. Статические переменные существуют в течение всего жизненного цикла домена приложения, в котором они были созданы.

т.е. процесс приложения w3wp.exe, который порождает домен приложения, в котором выполняется сам процесс. Независимо от того, на какой запрос он отвечает в данный момент.

Таким образом, ваши статические переменные могут быть установлены одним пользователем, а сеанс чтения - другим пользователем с помощью этой настройки.

0 голосов
/ 17 июня 2011

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

0 голосов
/ 17 июня 2011

Попробуйте добавить семантику блокировки:

private static Object locker = new Object();

public static UserSession GetUserSession()
{
  lock( locker)
  {
    if (System.Web.HttpContext.Current.Session[USER_SESSION] != null)
    {
      return System.Web.HttpContext.Current.Session[USER_SESSION] as UserSession;
    }
    return null;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...