是,IIS(因此IISExpress,這是IIS打包在「應用」格式)是多線程。但是,你做出了一些不正確的假設。
首先,沒有。一個新的請求不產生一個新的線程,它運行在一個線程池線程上,並且這些線程池在前一個請求完成後重新使用(或者,正如你在一分鐘內看到的那樣,當一個異步請求等待時)。
其次,你不應該設置Thread.CurrentPrincipal
,因爲不僅在IIS多線程,它是異步的。這意味着如果你的線程等待,當它恢復時,它可能會運行在與它開始的線程不同的線程上。
第三,Thread.CurrentPrincipal
通常是工作進程(或程序池)的身份的身份,改變這改變了整個線程下運行的安全上下文。一個更好的選擇是使用WindowsImpersonationContext
類做模擬(這是我假設你正在嘗試做)。
WindowsIdentity clientId = (WindowsIdentity)User.Identity;
// When 'using' block ends, the thread reverts back to previous Windows identity,
// because under the hood WindowsImpersonationContext.Undo() is called by Dispose()
using (WindowsImpersonationContext wic = clientId.Impersonate())
{
// do your work that needs the identity
}
如果你需要設置你通常應該使用HttpContext.Current.User
,而不是一個Thread.CurrentPrincipal中自定義主體。
_「......要求到IIS中創建新的線程...」 _ - 最有可能的請求會在下一可用線程池線程。所以線程ID隨着時間的推移將不會是唯一的 – MickyD
@rubyhaus實際上你的擔心是什麼,我假設什麼時候在chrome中有同一用戶的請求,你不想讓他在其他瀏覽器中,這是你正在嘗試實現 ? – Webruster