IISExpress 是单线程的吗?

2024-01-10

我正在编写一个利用声明来确保安全的自定义 .Net 应用程序,因为我们正在跨越许多边界 - Web、API、批处理等。在开发过程中,有时我会在通过 Chrome 登录时在系统中创建一些内容,然后我会通过 Edge 中的另一个帐户来测试新创建的项目,并且以某种方式HttpContext.Current.User.Identity对应于我的 Chrome 会话。我确实设置了Thread.CurrentPrincipal在幕后,但我的理解一直是所有进入 IIS 的请求都会产生一个新线程,所以我无法弄清楚为什么 Edge 请求会像 Chrome 请求一样被处理。

是否有可能因为 Visual Studio 处于调试模式而共享此信息?


IIS(以及 IISExpress,它是以“应用程序”格式打包的 IIS)是多线程的。但是,您做出了一些错误的假设。

首先,不。新请求不会生成新线程,它在线程池线程上运行,并且在前一个请求完成后(或者,正如您稍后将看到的,当异步请求等待时)重新使用这些线程池。

其次,你不应该设置Thread.CurrentPrincipal,因为 IIS 不仅是多线程的,而且是异步的。这意味着,如果您的线程等待,当它恢复时,它可能会在与其启动的线程不同的线程上运行。

Third, Thread.CurrentPrincipal通常是工作进程(或AppPool)身份的身份,更改此身份会更改整个线程运行的安全上下文。更好的选择是使用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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IISExpress 是单线程的吗? 的相关文章

随机推荐