내 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 구현에 실수가 있습니까?
좋아, 나는 그 쿠키가 단지 하나의 요청 (즉, 중지 요청)에서 제거된다고 생각했다. – curiosity
"Stop"후에 동일한 사용자의 다음 요청에 새 세션이 생기지 만 그 이유는 알 수 없습니다. – curiosity
@AnnaPrenzel - 귀하의 가정이 잘못되었습니다. 세션 쿠키는 브라우저의 모든 인스턴스간에 공유됩니다. 쿠키를 제거하면 모든 인스턴스에서 쿠키가 제거됩니다. 각 웹 요청은 쿠키를 보내므로 쿠키가 제거되면 새로운 요청 (심지어 다른 창에서도)에는 쿠키가 없으므로 새로운 세션이 만들어집니다. 그러나 예외가 있습니다. 새로운 "비공개"창을 열면 쿠키가 비공개 창과 분리됩니다. –