asp.net核心中间件中的静态属性是在请求之间共享的吗?
问题描述:
我有一个静态类User
与静态属性Username
。我在每个url请求的中间件中设置此属性。然后我在网站的标题中向用户显示Username
。asp.net核心中间件中的静态属性是在请求之间共享的吗?
在每个请求上,都会设置此静态属性,然后在视图中显示。我假设每个请求都会在属性中拥有自己的(正确)值,并且该值不会在不同请求之间共享?
所以,如果请求一有价值adam
和请求2有价值john
,亚当会看到亚当和约翰会看到约翰在头?这在我的应用中工作正常,但只是想确保在概念上它是正确的?
答
这是因为您已被告知是一个很好的候选人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
在头
上的对象的静态性质不同的请求之间共享,至少只要'正在单个实例/单个计算机上运行。但是,您可能会考虑使用情况的缓存,而不是使用静态属性:[官方文档](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory)。您必须具有密钥或不同者,否则所有请求都会看到相同的值。 – GeorgDangl
谢谢乔治。我知道静态属性是共享的,但是如果静态属性在每个请求中会有不同的值。请求之间的值是否有重叠(在单台计算机上)? – user3219798
你应该假设请求并行运行,所以对于静态属性你可以有以下情况:Req1设置值'adam' - > Req2设置值'john' - > Req1打印值'john' - > Req2打印值'john '。 [这是关于会话数据和缓存的官方文档](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?tabs=aspnetcore2x)。总之,值可能会重叠(然后主要是在生产中,在调试时,负载可能更高) – GeorgDangl