httpmodule을 사용하여 백그라운드 서비스에서 세션에 액세스합니다

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

  •  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까지 교체되지 않습니다.

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