为什么只有在异步方法调用之前,才能使用模拟用户上下文?我编写了一些代码(实际上基于Web API)来检查模拟用户上下文的行为.
async Task<string> Test()
{
var context = ((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate();
await Task.Delay(1);
var name = WindowsIdentity.GetCurrent().Name;
context.Dispose();
return name;
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,在这种情况下,我将收到App pool用户的名字.代码运行的时间.这意味着我不再拥有被模仿的用户上下文.如果延迟更改为0,则使调用同步:
async Task<string> Test()
{
var context = ((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate();
await Task.Delay(0);
var name = WindowsIdentity.GetCurrent().Name;
context.Dispose();
return name;
}
Run Code Online (Sandbox Code Playgroud)
代码将返回当前模拟用户的名称.据我所知,等待和调试器显示的内容,在分配名称之前不会调用context.Dispose().