2014-07-15 2 views
4

HttpContext.Current가 정적 속성 인 이유가 약간 혼란 스럽습니까? 런타임에 하나 이상의 요청을 처리하는 중이면 정적이기 때문에 모든 요청이 동일한 Current 값을 볼 수 있습니까? 또는 일부 동기화 기술을 사용하여 프레임 워크로 처리되며, 그렇다면 왜 정적이 아닌 일반 속성이 사용됩니다.HttpContext.Current가 정적 인 이유

누락 된 항목이 있습니까?

public static HttpContext Current 
{ 
    get 
    { 
    return ContextBase.Current as HttpContext; 
    } 
    set 
    { 
    ContextBase.Current = (object) value; 
    } 
} 

그리고 ContextBase 그 속성에 사용 :

internal class ContextBase 
{ 
    internal static object Current 
    { 
    get 
    { 
     return CallContext.HostContext; 
    } 
    [SecurityPermission(SecurityAction.Demand, Unrestricted = true)] set 
    { 
     CallContext.HostContext = value; 
    } 
    } 

그리고 CallContext : 여기

답변

6

Current 재산의 구현입니다

public sealed class CallContext 
{ 

    public static object HostContext 
    { 
    [SecurityCritical] 
    get 
    { 
     ExecutionContext.Reader executionContextReader = 
     Thread.CurrentThread.GetExecutionContextReader(); 
     return executionContextReader.IllogicalCallContext.HostContext ?? executionContextReader.LogicalCallContext.HostContext; 
    } 
    [SecurityCritical] 
    set 
    { 
     ExecutionContext executionContext = 
     Thread.CurrentThread.GetMutableExecutionContext(); 
     if (value is ILogicalThreadAffinative) 
     { 
     executionContext.IllogicalCallContext.HostContext = (object) null; 
     executionContext.LogicalCallContext.HostContext = value; 
     } 
     else 
     { 
     executionContext.IllogicalCallContext.HostContext = value; 
     executionContext.LogicalCallContext.HostContext = (object) null; 
     } 
    } 

당신은 CallContext.HostContext에서 볼 수 있듯이 그것은 Thread.CurrentThread 객체를 사용하고, 그것은 b 현재 스레드까지 길어 지므로 다른 스레드와 공유되지 않습니다.

때로는 Page \ Controller 외부에서 HttpContext에 액세스해야합니다. 예를 들어 다른 곳에서 실행되지만 페이지에서 트리거 된 코드가있는 경우를 예로들 수 있습니다. 그런 다음 해당 코드에서 HttpContext.Current을 사용하여 현재 요청, 응답 및 기타 모든 컨텍스트 데이터에서 데이터를 가져올 수 있습니다.

+0

와우! ..이 정보를 제공해 주셔서 감사합니다. 나는 그것에 대해 모른다 – user3359453

+1

@ user3359453 FYI 이러한 코드 비트는 http://referencesource.microsoft.com에서 .NET 프레임 워크의 내부 이해를 위해 Microsoft에서 사용할 수 있습니다. –

관련 문제