리디렉션에서 ASP.NET MVC TempData를 사용할 때 가능한 "레이스 조건"이 있습니까?

StackOverflow https://stackoverflow.com/questions/235665

문제

TempData를 사용할 때, 내 이해는 하나의 요청만으로 당신이 넣은 모든 것을 유지한다는 것입니다. 따라서 TempData를 사용하여 리디렉션에서 데이터를 유지하는 경우 (Ququest-Get 패턴을 사용하기 위해) 리디렉션을 보내는 응답과 리디렉션 된 페이지를 요청하는 사용자의 브라우저? 어떤 경우에는 더 이상 TempData를 사용할 수 없습니다. 맞습니까?

이제 그런 일이 발생하는 것은 매우 드물다는 것을 이해하지만, 사용자가 다른 탭에 다른 페이지가 열려있을 수 있다는 것을 고려하고 있으며, 그 페이지에 AJAX 또는 시간이 지정된 콜백 요청이있을 수 있습니다. 갑자기 갑자기 그렇지 않을 수 있습니다. 나에게 불가능 해 보인다. 일반적으로 걱정하기에는 너무 멀리있는 것으로 간주됩니까, 아니면 내가 무언가를 오해하고 있습니까?

편집 : 내가 묻는 시나리오에 대해 더 구체적으로.

  1. 탭 1에서 사용자는 게시물 양식으로 페이지로 탐색합니다.
  2. 탭 2에서 사용자는 타이머에서 Ajax 콜백을 수행하는 사이트의 다른 페이지로 브라우저
  3. 탭 1에서 사용자는 양식을 서버에 게시합니다.
  4. 서버가 게시물을 수신하면 TempData에 일부 데이터를 저장하고 리디렉션 응답을 다시 보냅니다.
  5. 탭 2에서는 시간이 정한 Ajax 콜백이 발생하여 서버에 GET 요청을 보냅니다. TempData는 세션에서 제거됩니다
  6. 탭 1에서 브라우저는 리디렉션을 수신하고 GET 요청을 발행합니다.
  7. 서버는 GET 요청을 처리하고 TempData를 찾지만 더 이상 거기에 없습니다.
도움이 되었습니까?

해결책

글쎄, ASP.NET MVC 코드를 탐색하면 세션에 TempData가 저장되면로드 된 경우 세션에서 제거됩니다. 컨트롤러의 ExecuteCore () 메소드에로드됩니다.

그래서 저는 그렇습니다. 다른 브라우저 탭의 요청 이이 문제를 일으킬 수있는 레이스 조건에 전적으로 들어갈 수 있다고 생각합니다. 그러나 이는 요청 처리를위한 각 브라우저의 모델에 따라 다릅니다. 브라우저는 모든 요청을 동일한 서버로 직렬화하여 한 번에 한 번만 실행할 수 있습니다. 그러나 실제로는 그렇게하지 않을 것입니다. 그들은 동일한 서버에 대한 최대 5 개의 동시 요청 인 Max에서 그것을 막을 것입니다.

ASP.NET MVC 사이트가 모든 브라우저에 대한 서비스 요청이 될 수 있다는 점을 감안할 때 (AfterAll :)) 말한 것처럼 실제 시나리오 일 것입니다.

다른 팁

TempData를 사용할 때 레이스 상태를 가질 수 있습니다. 그러나 정상적인 사용에 따라 경험하기 위해서는 물론 "운이 좋지 않다"고해야합니다. 레이스 조건에 부딪 치려면 다음이 모두 사실이어야합니다.

  1. 처음부터 TempData를 사용해야합니다.
  2. 여러 브라우저 Windows/Tabs/Whatevers가 동일한 브라우저 세션을 열고 공유해야합니다.
  3. 두 번째 브라우저 탭의 요청은 첫 번째 브라우저 탭의 요청과 응답 사이에 "몰래"해야합니다.

항목 #2는 사용중인 브라우저에 따라 다릅니다. IE 설정 방법에 따라 여러 개의 창을 열었다고해서 브라우저 쿠키를 공유한다는 의미는 아니기 때문에 반드시 세션 (쿠키 기반)을 공유 할 필요는 없습니다.

그러나, 당신이 그것을 달리면 무언가가 폭발한다는 의미에서는 인종 조건이 없습니다. 그것은 Haacked가 언급 한 것일 수 있습니다. 하지만 당신 ~할 수 있다 한 번의 요청에 약간의 TempData를 설정 한 다음 다음 요청에서 다시 얻지 못했다는 의미에서 레이스 조건을 누르십시오. 생각 당신은 그것을 얻을 것입니다. 그냥 비어있을거야.

고마워, 에일론

Tempdata는 세션 객체를 사용 하여이 문제를 겪지 않습니다. 이것에 대한 특정 문제를 겪었습니까?

처음에는 동일한 혼란을 겪지 만, 디버그 모드에서 MVC 웹 애플리케이션을 실행하면 리디렉션 조치에서 중단 점을 설정하고 템프 다타를 값을 부여합니다. viewresult 리디렉션 및 다른보기에서 온도를 얻을 수 있습니다. 다른 뷰는 리디렉션 작업이 완료 될 때까지 다른 요청이 응답되지 않는다는 것을 알게 될 것입니다. 한 번에 단일 요청. 따라서 언급 된 위의 시나리오는 결코 발생할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top