是,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