2012-10-29 14 views
5

Próbuję użyć sesji, ale kiedy potrzebuję wartości z powrotem jej zerowy?Jak długo sesja [] zachowuje dane?

Moja strona zaczyna się logowaniem, w którym umieszczam nazwę użytkownika w sesji.

Session["userName"] = login.UserName; 

Następnie strona jest przekierowywana na nową stronę.

return RedirectToAction("Choice", new { token = token }); 

po użyciu czarownicy używam linku, aby przejść do następnej strony.

@Html.ActionLink("Download", "Download", new {token = Model.Token}) 

Gdzie kieruję mój kod do wyniku akcji w kontrolerze głównym, ten sam kontroler mam swoją funkcję logowania.

@Html.ActionLink("Download", "DownloadFile", new { fileid = item.Key, token = Model.Token, platform = "windows", filename = item.Value }, new {@class = "DownloadLink" }) 

Gdzie próbuję ponownie wywołać wartość mojej sesji.

formMobiApi.GetFile(token, fileid, platform, filename, Session["userName"].ToString(), tasks, taskId, spreadSheetStatus); 

Czy którekolwiek z tych działań powodują obniżenie wartości mojej sesji?

Czy mogę użyć sesji podobnej do tej?

+1

W jaki sposób obsługiwane są twoje sesje? Czy są one oparte na plikach cookie czy inproc? Jaka jest wartość limitu czasu sesji w twoim pliku web.config? –

+0

Nie mogłem znaleźć żadnych limitów czasu sesji w moim web.Config i nie jestem pewien, czy moje sesje są oparte na plikach cookie lub inproc, w jaki sposób mogę sprawdzić? – Pomster

Odpowiedz

9

Jeśli nie są ręcznie ustawiania stanu sesji w pliku web.config wtedy domyślne ty powinny które są w trakcie procesu (sesje są przechowywane w pamięci RAM serwera internetowego), a limit czasu wynosi 20 minut - see here for more information on session states.

Można ręcznie ustawić swoje stany w pliku web.config z następujących czynności:

<configuration> 
    <system.web> 
     <sessionState mode="InProc" timeout="20"></sessionState> 
    </system.web> 
</configuration> 

Teraz na rzeczywisty problem. Nie jestem do końca pewien, dlaczego twoja sesja nie trwa i nie mogę się tego dowiedzieć, ponieważ nie mam kopii kodu do debugowania. Na domysły powiedziałbym, że twoje HttpContext różni się od tego, kiedy zainicjowałeś sesję, kiedy prosisz o nią, a więc twój klucz kontekstowy jest inny. Spróbuj zmienić

Session["userName"].ToString(); 

do

HttpContext.Current.Session["userName"].ToString(); 

Wygląda to trochę dziwne na pierwszy rzut oka, jak jesteś skutecznie robi dokładnie to samo. Różnica sprowadza się do tego, że jeśli bieżący obiekt nie ma dostępu do HttpContext, musisz wyraźnie określić, z którego kontekstu chcesz odczytać.

Przyjrzawszy się podanego kodu, nie ma nic niezwykłego - to powinno zadziałać. Naprawdę zaczynam wierzyć, że jest to problem związany ze środowiskiem/konfiguracją. Jeśli używasz uwierzytelniania formularza, sprawdź limit czasu w pliku web.config. Ponadto, jeśli hostujesz w IIS (a nie w serwerze WWW Visual Studio - chociaż powinieneś to sprawdzić!), Spróbuj usunąć pulę aplikacji i ponownie ją utworzyć.