2012-04-16 4 views
32

이유가 무엇입니까 ASP.NET MVC 응용 프로그램에서 세션 변수를 사용해서는 안됩니다? 나는 이렇게 말한 this answer을 발견했다. 이 경우 어떻게 Logged in User 정보 및 그의 계정과 관련된 일부 관련 데이터와 같은 요청간에 가치를 유지할 수 있습니까?왜 세션이 ASP.NET MVC 응용 프로그램에서 재앙입니까?

이것은 Darin 님의 답변입니다.

왜 ASP.NET MVC 응용 프로그램에서 HttpContext.Current를 사용하고 있습니까? 사용하지 마십시오. 그것은 고전 ASP.NET 웹폼 응용 프로그램에서도 악하지만 ASP.NET MVC에서는 재밌습니다.이 멋진 웹 프레임 워크에서 모든 재미가 에 걸립니다. ASP.NET MVC와 같은 프레임 워크의 기본 원칙의

+13

나는 세션을 사용해서는 안된다고 말하지는 않았다. (실제로 나는 그것을 말했고 지금은 말하고 있지만 당신이 링크 한 대답은 아니다). 나는 당신이'HttpContext.Current'를 사용하여 현재 HTTP 문맥에 접근해서는 안된다고 말했다. –

+0

다음은 HttpContext.Current를 사용하는 것이 나쁜 생각 인 이유 중 하나를 설명하는 문서입니다. 기본적으로 스레드로부터 안전하지 않습니다. http://odetocode.com/articles/112.aspx – JTech

답변

27

하나는 웹이처럼 을 점이다. ASP.NET Web Forms는 상태 비 저장 환경에 대한 상태 패러다임을 모방하려는 시도입니다. It is a lie 즉,

ASP.NET MVC 응용 프로그램에서 세션 변수를 사용하는 것은 경적을 말의 머리에 매어 Unicorn이라고 부르는 것과 같습니다.

+16

이 부분을 해결할 수 있습니까? '요청간에 가치를 어떻게 유지할 것인가? ' 분명히 나는 ​​이것을 매우 잘못하고있다. ... – asawyer

+1

데이터베이스에 저장한다. http://www.asp.net/mvc에서 제공되는 자습서, 특히 NerdDinner 자습서를 검토해야합니다. –

+1

내 경우의 백업 저장소가 때로는 매우 느리고 각 작업을 수행하면 작동하지 않습니다./ – asawyer

5

세션 상태를 사용하여 데이터를 유지할 수 있으며, TempData 기능은 세션을 기본값으로 사용하여 데이터를 유지합니다.

가능한 한 세션 사용을 최소화해야합니다. 그 이유는 세션 상태가 손상되지 않도록 모든 요청에 ​​대해 세션 잠금이 수행되어야하기 때문입니다. 예를 들어 여러 Ajax 요청이이 때문에 직렬화됩니다. 추가 정보 here

MVC Futures의 일부인 예를 들어 CookieValueProvider을 사용하여 요청간에 데이터를 유지할 수있는 대안을 사용할 수 있습니다. 쿠키 데이터를 모델에 바인딩합니다. 또한 실제 DOM에있는 데이터를 숨겨진 필드로 유지할 수 있지만 데이터의 크기가 브라우저와의 네트워크 트래픽에 반영되므로 가능한 한 최소화해야합니다.

기본 저장소가 느린 경우 웹 응용 프로그램에 다른 데이터 저장소를 사용하는 것이 좋습니다. 예를 들어 SQLServer CE 또는 포함 된 RavenDB.

+0

그들은 직렬화하지 않고 동기화합니다. – KingOfHypocrites

+0

병렬 요청 동기화로 직렬화가 발생합니다. (차례대로) –

+0

직렬 이벤트는 차례로 발생하며 직렬화는 일반적으로 메모리에서 데이터를 가져 와서 디스크에 저장할 수있는 형식으로 지정합니다. – mikeschuld

관련 문제