gpt4 book ai didi

c# - HttpContext.Current 如何处理 IIS 管道中的每个请求?

转载 作者:太空狗 更新时间:2023-10-30 00:14:24 26 4
gpt4 key购买 nike

如您所知,HttpContext.Current返回应用程序管道中的当前上下文。
此属性也是 static,因此从逻辑上讲,对该属性或其属性的任何更改都应该影响其他管道。

A static field identifies exactly one storage location. No matter how many instances of a class are created, there is only ever one copy of a static field. More

IIS 如何处理此问题以防止在其他管道上发生冲突,并且每个 HttpContext.Current 在每个管道上都是唯一的?

例如,对于已经登录系统的两个用户,HttpContext.Current.User.Identity.Name 给出了向服务器发送请求的用户的用户名。

ASP.NET 管道:
enter image description here

最佳答案

Current是属性,不是字段,所以它实际上是一个静态方法。

这个方法可以为不同的线程返回不同的实例,而且确实如此。

如果您正在开发多线程 Web 应用程序,请记住以下几点。

  1. 不要使用 ThreadStaticAttribute .它适用于 Windows 和控制台应用程序,但它可能不适用于 Web 应用程序,因为如果您使用 async,单个请求可以由不同的线程处理。 , await , 和 Task<T> .

  2. 使用 HttpContext.Current.Items而不是 ThreadStaticAttribute .这些Items在每个 HttpContext 中都是“静态的” .

  3. 使用 SynchronizationContext如果您需要 HttpContext 的重要设置(区域设置、登录用户和您自己的 HttpContext.Items )在异步调用之后(如果您没有使用 await )。

之所以要小心,是因为线程池。您的异步方法很可能在第一个线程中开始运行,在第二个线程中继续运行,并在第三个线程中结束。由于每个线程都有自己的线程静态字段副本,您可以在方法的不同位置获得不可预知的不同字段值。 SynchronizationContext允许您返回到具有正确区域设置值的初始线程,HttpContext.Itemsawait运算符对你有用,所以你不应该关心上下文,如果你使用 await (感谢@StephenCleary 的更正)。

现在是线程静态字段。当 ASP.NET 收到 HTTP 请求时,它会创建 HttpContext 的新实例空 HttpContext.Items收藏。同时ThreadStatic字段已由先前的 HTTP 请求初始化。因此。一个Singleton基于线程静态字段的类可能无法正常工作。它在 Web 应用程序的同步和异步方法中都很重要。

关于c# - HttpContext.Current 如何处理 IIS 管道中的每个请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28008786/

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