0

내 ASP .NET MVC 2 - 응용 프로그램에는 세션 상태가 필요한 여러 컨트롤러가 있습니다. 그러나 어떤 경우에는 내 컨트롤러 중 하나가 매우 오래 실행되고 클라이언트는이를 멈출 수 있어야합니다. 2 개 동시 요청이 하나 가능하지 않은 ASP .NET MVC에서, 불행하게도동시 요청 : 단일 요청에서 세션 ID를 제거한 후 세션이 손실되었습니다.

public ActionResult Stop() 
    { 
     ... 
    } 

: 이것은 컨트롤러가 요청을 중지하는 것입니다

[SessionExpireFilter] 
    [NoAsyncTimeout] 
    public void ComputeAsync(...) //needs the session 
    { 
    } 

    public ActionResult ComputeCompleted(...) 
    { 

    } 

:

다음은 장기 실행 컨트롤러 동일한 사용자이므로 내 Stop-Request는 장기 실행 작업이 완료 될 때까지 기다려야합니다. 그러므로 나는 this article에 설명 된 트릭을 시도하고 Global.asax.cs에 다음 처리기를 추가 한 :

protected void Application_BeginRequest() 
    { 
     if (Request.Url.AbsoluteUri.Contains("Stop") && Request.Cookies["ASP.NET_SessionId"] != null) 
     { 
      var session_id = Request.Cookies["ASP.NET_SessionId"].Value; 

      Request.Cookies.Remove("ASP.NET_SessionId"); 
      ... 
     } 
    } 

이것은 단순히 정지-요청의 세션 ID를 제거합니다. 첫눈에 이것은 잘 작동합니다. Stop-Request가 처리되고 작업이 중지됩니다. 그러나 그 후에는 장기 실행 요청을 가진 사용자 세션이 종료 된 것으로 보입니다.

나는 세션 시간 제한을 인식하기 위해 내 자신의 SessionExpireFilter를 사용 중지-요청이 호출 된 후

public class SessionExpireFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpContext ctx = HttpContext.Current; 

     // check if session is supported 
     if (ctx.Session != null) 
     { 
      // check if a new session id was generated 
      if (ctx.Session.IsNewSession) 
      { 

       // If it says it is a new session, but an existing cookie exists, then it must 
       // have timed out 
       string sessionCookie = ctx.Request.Headers["Cookie"]; 
       if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 

        filterContext.Result = new JsonResult() { Data = new { success = false, timeout = true }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; 
       } 
      } 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

ctx.Session.IsNewSession 항상 사실입니다,하지만 난 이유를 모르겠어 . 누가 세션이 손실되었는지 아는 사람 있습니까? Stop-Controller 구현에 실수가 있습니까?

답변

1

세션 쿠키를 제거했기 때문에 세션이 손실되었습니다. 왜 내가 비논리적인지 모르겠다. 각각의 새 페이지 요청은 asp.net에 쿠키를 제공하고 쿠키가 없으면 새 페이지 요청을 생성합니다.

쿠키없는 세션을 사용하면 쿼리 문자열에 토큰을 추가 할 수 있습니다. 로그인 할 때마다 새로운 세션을 생성하면됩니다.

그러나 이것은 세션 변수가 사용되지 않는 이유 중 하나입니다. 인 페이지 변수를 사용하도록 코드를 변경하거나 데이터베이스에 변수를 저장할 수 있습니까?

+0

좋아, 나는 그 쿠키가 단지 하나의 요청 (즉, 중지 요청)에서 제거된다고 생각했다. – curiosity

+0

"Stop"후에 동일한 사용자의 다음 요청에 새 세션이 생기지 만 그 이유는 알 수 없습니다. – curiosity

+1

@AnnaPrenzel - 귀하의 가정이 잘못되었습니다. 세션 쿠키는 브라우저의 모든 인스턴스간에 공유됩니다. 쿠키를 제거하면 모든 인스턴스에서 쿠키가 제거됩니다. 각 웹 요청은 쿠키를 보내므로 쿠키가 제거되면 새로운 요청 (심지어 다른 창에서도)에는 쿠키가 없으므로 새로운 세션이 만들어집니다. 그러나 예외가 있습니다. 새로운 "비공개"창을 열면 쿠키가 비공개 창과 분리됩니다. –

관련 문제