2016-04-22 100 views
2

我需要能夠輕鬆地爲我們在MVC項目之外的程序集中運行的許多查詢獲取用戶名。我只是爲所有呼叫添加一個參數,但實際上有數百個參數。從外部庫併發訪問HttpContext

我的同事建議我傳遞一個靜態引用到HttpContext(大概在OnApplicationStarted或類似的東西)並從那裏獲取用戶名。

HttpContext總是有關於當前用戶會話的信息。我對此的關注是,如果我的對象(存在於單獨的程序集中)不會知道哪個用戶準確地從中獲取信息,並且雖然這可能適用於單個用戶,但它會將錯誤的用戶名更改爲更多用戶開始訪問系統。

這是識別用戶名的可行方法嗎?

HttpContext如何知道哪個用戶是當前用戶?該機制是否在項目之外被切斷?

+0

如果您可以在外部庫中使用Session,那麼您應該在會話中設置用戶名並從那裏訪問它。所有的意思是說從會話中獲取用戶名信息。 –

+0

@AnkushJain:有趣的是你認爲它應該可以工作。我擔心的是,因爲這將是一個靜態對象(即所有用戶只有1個),當用戶名被拉時,它可能是針對其他人的。 – micahhoover

+0

我不是說要創建一個靜態變量。我要求使用會話變量。會話總是用戶特定的。 –

回答

2

HttpContext實例不是全局的 - 它是特定請求的上下文。因此,例如,如果您正在執行控制器操作,並且您撥打HttpContext(即Controller.HttpContext),那麼您正在處理該請求的上下文。因此,上下文無關的用戶是沒有問題的 - 這是發起該請求的用戶。

你不想從OnApplicationStarted引用它。它要麼不可用,要麼將成爲當前請求的上下文。

這就是說,如果你需要的是一個用戶名,那麼我不知道你爲什麼要通過一個整體HttpContext。一個函數應該只接收它需要的參數。如果需要用戶名,你可以從HttpContext.User.Identity.Name得到。這將使其他庫更容易測試。而如果其他庫被稱爲但不是來自Web應用程序呢?然後將不會有一個HttpContext傳遞給它。

0

不知道其他人暗示這事,但在這裏不用...

我的同事勸我引用的System.Web像這樣:

var username = System.Web.HttpContext.Current.Session["user"]; 

我找回用戶名。

我不完全確定這是一個可靠的解決方案,但似乎沒有一個方便的方法來測試(沒有詳細的負載測試)。

如果兩個工作線程同時調用這個庫,我不確定.NET框架如何知道外部庫想要一個用戶名和另一個用戶名。