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

时间:2017-09-29 13:51:56

标签: asp.net-core asp.net-core-middleware

我有一个带有静态属性User的静态类Username。我在每个url请求的中间件中设置此属性。然后我在网站标题中向用户显示Username

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

因此,如果请求1的值为adam且请求2的值为john,则adam会看到adam和john会在标题中看到john吗?这在我的应用程序中工作正常但只是想确保概念上它是正确的吗?

1 个答案:

答案 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