gpt4 book ai didi

asp.net - 为什么 HttpContext.Current 是静态的?

转载 作者:行者123 更新时间:2023-12-04 18:06:56 25 4
gpt4 key购买 nike

我有点困惑为什么 HttpContext.Current 是静态属性?如果运行时当时正在处理 1 个以上的请求,那么所有请求是否会看到相同的 Current 值,因为它是静态的?或者它是通过使用某种同步技术的框架来处理的,如果是这样,为什么静态不是正常属性。

遗漏了什么 ?

最佳答案

这是 Current 的实现属性(property):

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;
}
}

和调用上下文:
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对象,它属于当前线程,因此不会与其他线程\请求共享。

有时您需要从 Page\Controller 外部访问 HttpContext。例如,如果您有一些代码在其他地方执行,但它是从 Page 触发的。然后在该代码中您可以使用 HttpContext.Current从当前请求、响应和所有其他上下文数据中获取数据。

关于asp.net - 为什么 HttpContext.Current 是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24759756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com