2014-12-26 1 views
0
내 사용자를 계산하려면

이 그 아래 코드는 내 DLL 파일입니다 : 내가 설정 한Session_End 이벤트 중에 HttpContext.Current가 null 인 이유는 무엇입니까?

public static class UserCount 
{ 
    public static void add() 
    { 
     HttpContext.Current.Application.Lock(); 
     int count = (int) HttpContext.Current.Application["CountOfUsers"]; 
     count++; 
     HttpContext.Current.Application["CountOfUsers"]=count; 
     HttpContext.Current.Application.UnLock(); 
    } 

    public static void subtract() 
    { 
     HttpContext.Current.Application.Lock();//error : HttpContext.Current is null. why? 
     int count = (int) HttpContext.Current.Application["CountOfUsers"]; 
     count--; 
     HttpContext.Current.Application["CountOfUsers"]=count; 
     HttpContext.Current.Application.UnLock(); 
    } 
} 

Session.TimeOut=1; 1 분 아래 Global.asax 파일의 방법 후,이 실행됩니다 :

protected void Session_End(object sender, EventArgs e) 
    { 
     UserCount.subtract(); 
    } 

subtract 방법 HttpContext.Current null가 예외를 던질 원인이?

+1

철자 검사를 포함하여 더 명확하게 질문을 시도하십시오. –

+0

'global.asax','session_end' – Abhitalks

+0

@AndersAbel 님이 고칠 수 있었습니까? – rene

답변

4

Session_End에는 반드시 브라우저와 관련된 통신이 없으므로 참조 할 HttpContext가 없기 때문에 null 인 이유를 설명합니다.

코드를 보면 응용 프로그램 캐시에서 서로 얽혀있는 것처럼 보입니다. HttpApplication 인스턴스의 Application 속성을 통해 사용할 수 있습니다. 당신이 HttpApplicationState 소요 당신의 USERCOUNT 클래스에 과부하를 만들 경우

당신은 괜찮을거야 :

public static void subtract(HttpApplicationState appstate) 
{ 
    appstate.Lock(); 
    int count = (int) appstate["CountOfUsers"]; 
    count--; 
    appstate["CountOfUsers"]=count; 
    appstate.UnLock(); 
} 

당신은과 같이 Session_End에서이를 사용할 수 있습니다

protected void Session_End(object sender, EventArgs e) 
{ 
    UserCount.subtract(Application); 
} 

이것은 global_asax 때문에 작동 기술적으로는 HttpApplication의 하위 클래스이므로 global_asax 파일에서 모든 멤버에 액세스 할 수 있습니다.

substract의 다른 구현은 HttpContext가있을 때 사용할 수 있습니다.

+0

이것을 확인하기 위해 파기를 조금했지만, 나는 당신이 옳다고 믿습니다. 'HttpContext.Current'는 실행 문맥에 의존합니다. 이것은'Session_End'가 실행될 때 달라 지거나 빠져 있습니다. 응용 프로그램 상태는 여전히 사용할 수 있습니다 (내부적으로 정적 멤버 임). 그 트릭은 당신이 보여준 것처럼 그것에 도달하는 것입니다. 흥미롭게도, 나는 OP의 코드가 IIS 6에서 작동했을 것이라고 믿습니다. 나는 몇 년 전에 비슷한 문제를 떠 올렸다. –

+0

그래,하지만 ... Session_End가 실행 중이라면 끝나는 세션에 액세스 할 수 없습니까? 끝나는 세션을 정리하려면 ... 세션 종료 이벤트에서? – Triynko

+0

@Triynko 예, [HttpApplication.Session] (https://msdn.microsoft.com/en-us/library/system.web.httpapplication.session (v = vs.110) .aspx)을 통해 가능합니다. OP의 문제점은 null 일 수있는 HttpContext.Current를 사용하여 해당 세션에 액세스하려고했기 때문입니다. – rene

관련 문제