httpmodule을 사용하여 백그라운드 서비스에서 세션에 액세스합니다
-
06-09-2019 - |
문제
ASP.NET에서 세션 타임 아웃을 확인하고 사용자를 타임 아웃 페이지 (로그인 페이지가 아닌)로 리디렉션하는 백그라운드 서비스를 작성하려고합니다. 내 코드는 다음과 같습니다
public class SessionTimeoutModule : IHttpModule
{
private static Timer timer;
//Test value
private const int interval = 1000 * 1 * 10;
public void Init( HttpApplication application )
{
if ( timer == null )
{
timer = new Timer( new TimerCallback( CheckSessionTimeout ),
application.Context, 0, interval );
}
}
private void CheckSessionTimeout( object sender )
{
HttpContext ctx = (HttpContext)sender;
if ( ctx.Session != null && ctx.Session.IsNewSession )
{
var cookie = ctx.Request.Headers["Cookie"];
if ( cookie != null )
{
if ( cookie.ToUpper().IndexOf( "ASP.NET_SESSIONID" ) >= 0 )
{
ctx.Response.Redirect( "" );
}
}
}
}
public void Dispose()
{
timer = null;
}
}
여기서 문제는 ChecksessionTimeout 메소드에서 세션 값을 얻을 수 없다는 것입니다. 항상 널입니다. 여기서 세션을 어떻게 얻을 수 있습니까?
나는 보았다 이것 해결책이지만 도움이되지 않습니다.
해결책
당신이 여기에서 잘못된 트랙에있는 것이 두렵습니다. 이와 같은 httpmodule을 사용하여 백그라운드 서비스를 구현할 수 없습니다. 당신이 지나가는 httpcontext는 HTTP 요청에 묶여 있으며, 당신이하려는 것처럼 보관해서는 안된다고 확신합니다. 또한 세션 타임 아웃을 감지 할 수 있더라도 활성 요청없이 사용자를 새 페이지로 리디렉션 할 수있는 방법이 없습니다.
당신은 찾을 수 있습니다 이 스레드 도움이 되는.
다른 팁
여기에 논리적 실수가 있다고 생각합니다. 코드를 수정하더라도 종료 세션을받지 못할 것입니다.
세션에 액세스 할 수 있으면 SessionID가 있습니다. 이런 식으로 타임 아웃으로 끝나는 세션을 얻을 수 없습니다.
Global.asax의 session_end를 사용해야 할 수도 있습니다. 그러나 나는 그것이 도움이 될지 확신하지 못한다.
또한 여기에서 SessionID는 Session.Abandon까지 교체되지 않습니다.
제휴하지 않습니다 StackOverflow