asp.net核心中间件中的静态属性是在请求之间共享的吗?

问题描述:

我有一个静态类User与静态属性Username。我在每个url请求的中间件中设置此属性。然后我在网站的标题中向用户显示Usernameasp.net核心中间件中的静态属性是在请求之间共享的吗?

在每个请求上,都会设置此静态属性,然后在视图中显示。我假设每个请求都会在属性中拥有自己的(正确)值,并且该值不会在不同请求之间共享?

所以,如果请求一有价值adam和请求2有价值john,亚当会看到亚当和约翰会看到约翰在头?这在我的应用中工作正常,但只是想确保在概念上它是正确的?

+0

上的对象的静态性质不同的请求之间共享,至少只要'正在单个实例/单个计算机上运行。但是,您可能会考虑使用情况的缓存,而不是使用静态属性:[官方文档](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory)。您必须具有密钥或不同者,否则所有请求都会看到相同的值。 – GeorgDangl

+0

谢谢乔治。我知道静态属性是共享的,但是如果静态属性在每个请求中会有不同的值。请求之间的值是否有重叠(在单台计算机上)? – user3219798

+1

你应该假设请求并行运行,所以对于静态属性你可以有以下情况:Req1设置值'adam' - > Req2设置值'john' - > Req1打印值'john' - > Req2打印值'john '。 [这是关于会话数据和缓存的官方文档](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?tabs=aspnetcore2x)。总之,值可能会重叠(然后主要是在生产中,在调试时,负载可能更高) – GeorgDangl

这是因为您已被告知是一个很好的候选人HttpContext.Items与一个唯一的对象密钥,以避免关键冲突。由于每个上下文对于每个请求都是唯一的,因此它们将允许这些值在不同请求之间不被共享。您没有将该值设置为中间件上的静态值,而是在当前的请求上下文中。

public class SampleMiddleware { 
    public static readonly object SampleKey = new Object(); 

    public async Task Invoke(HttpContext httpContext) { 
     httpContext.Items[SampleKey] = "some value"; 
     // additional code omitted 
    } 
} 

其他代码可以访问使用 由中间件类公开的密钥存储在HttpContext.Items值:

public class HomeController : Controller { 
    public IActionResult Index() { 
     string value = HttpContext.Items[SampleMiddleware.SampleKey]; 
    } 
} 

参考Introduction to session and application state in ASP.NET Core

因此,只有关键是静态的,而是项目中设置的值对于每个请求都是唯一的。这意味着你的情况,如果请求一个具有值adam和请求2具有值john,亚当将看到adam和John将看到john在头