Сохранять состояние объекта для одного и того же сеанса браузера

Ниже приведен мой код контроллера веб-API ASP.Net. Здесь, как вы можете видеть, используется объект частного класса, BL, и реализованы оба метода Get. Для первого метода FetchAllDashboardByUserId (int userId) я передаю идентификатор пользователя, чтобы можно было инициировать объект BL. В том же сеансе браузера, если вызывается второй метод get, я не хочу передавать идентификатор пользователя, поскольку BL должен быть инициирован по умолчанию, но в настоящее время это не так. BL для второго метода имеет значение null, поэтому мне нужно добавить идентификатор пользователя к вызову метода - GetCardDataUI (int userId, int dashBoardID, int cardID). У меня вопрос, как этого избежать. Я ошибаюсь в том, что:

  • Один открытый браузер, в котором я выполняю последовательный вызов следующих URL-адресов, представляет собой один сеанс:

    webapi / ViewR? userId = 1

    webapi / ViewR? userId = 1 & dashBoardID = 1 & cardID = 3

Я не хочу передавать userId во втором URL-адресе. Обратите внимание, что если я объявляю объект класса статическим, он работает так, как ожидалось, но это не то, что я хочу, он должен быть привязан к пользователю:

public class ViewRController : ApiController
    {
        // BL object for a user
        private static BL accessBL = null;

        // HTTP GET for Webapi/ViewR (Webapi - name of API, ViewR  - Controller with implementation)            

        [AcceptVerbs("Get")]
        public List<DashboardUI> FetchAllDashboardByUserId(int userId)
        {
            if (accessBL == null)
                accessBL = new BL(userId);

            // Use BL object for entity processing
        }

        [AcceptVerbs("Get")]
        public CardDataGetUI GetCardDataUI(int userId, int dashBoardID, int cardID)
        {
            if (accessBL == null)
                accessBL = new BL(userId);

            // Use BL object for entity processing
        }
    }

Как я хочу, чтобы реализация второго метода была:

[AcceptVerbs("Get")]
            public CardDataGetUI GetCardDataUI(int dashBoardID, int cardID)
            {
               // Use BL class object created in last call for entity processing
               // Should not pass userid again
            }

person Mrinal Kamboj    schedule 24.06.2014    source источник
comment
Вам нужно будет сохранить сведения о пользователе в состоянии сеанса. Посмотрите на этот stackoverflow.com/ questions / 9594229 /   -  person Praveen Reddy    schedule 24.06.2014
comment
@CodingDawg, спасибо. Это действительно решение, оно решает проблему для меня.   -  person Mrinal Kamboj    schedule 25.06.2014


Ответы (1)


Вы можете легко хранить данные в Session:

... first request:

Session["userID"] = userID;

... next request:

int userID = (int)Session["userID"];  // should check for null first, but you get the idea...

Но помните о следующих моментах:

  • Переменные сеанса хранятся как objects, поэтому вам нужно будет выполнить приведение и / или проверку типа
  • Переменные сеанса могут быть null
  • Сессия истекает через настраиваемое (в web.config) время
  • Состояние сеанса по умолчанию находится в памяти, что означает, что если пул приложений перезапущен, состояние сеанса пропало - вы можете сохранить сеанс в файлах или базах данных, чтобы сохранить его дольше.
  • Сеанс не масштабируется, если вы не используете постоянное хранилище (файл, базу данных)
  • Объекты, хранящиеся в постоянном хранилище, должны быть сериализуемыми.
person D Stanley    schedule 24.06.2014
comment
Это действительно решение, но требуется запись авторизации публикации в global.asax, как указано в приведенной выше ссылке CodingDawg, в противном случае объект сеанса всегда равен нулю. - person Mrinal Kamboj; 25.06.2014