Поддържайте състоянието на обекта за същата сесия на браузъра

Следва моят код на ASP.Net Web API контролер. Тук, както можете да видите, има обект от частен клас, BL, който се използва и двата метода Get са внедрени. За първия метод FetchAllDashboardByUserId(int userId) предавам потребителския идентификатор, така че BL обектът да може да бъде иницииран. В рамките на същата сесия на браузъра, ако се извика вторият метод за получаване, тогава не искам да предавам идентификатора на потребителя, тъй като BL трябва да бъде иницииран по подразбиране, но в момента това не е така. BL е null за втория метод, така че трябва да добавя userid към извикването на метода - 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/ въпроси/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