2017-09-29 76 views
2

我有一個靜態類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

回答

2

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

相關問題