這是因爲您已被告知是一個很好的候選人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