我有一个带有静态属性User
的静态类Username
。我在每个url请求的中间件中设置此属性。然后我在网站标题中向用户显示Username
。
在每个请求中,都会设置此静态属性,然后在视图中显示。我假设每个请求在属性中都有自己的(正确的)值,并且不会在不同的请求之间共享值?
因此,如果请求1的值为adam
且请求2的值为john
,则adam会看到adam和john会在标题中看到john吗?这在我的应用程序中工作正常但只是想确保概念上它是正确的吗?
答案 0 :(得分:6)
这是因为您已经被告知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会看到adam
,而john会在标题中看到john