gpt4 book ai didi

c# - IISExpress 是单线程的吗?

转载 作者:行者123 更新时间:2023-11-30 20:31:19 24 4
gpt4 key购买 nike

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

它共享此信息是否可能是因为 Visual Studio 处于 Debug模式?

最佳答案

IIS(因此 IISExpress,是以“应用程序”格式打包的 IIS)是多线程的。但是,您做出了一些不正确的假设。

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

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

第三,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。

关于c# - IISExpress 是单线程的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43382775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com