小编Paw*_*rys的帖子

异步方法调用和模拟

为什么只有在异步方法调用之前,才能使用模拟用户上下文?我编写了一些代码(实际上基于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().

.net c# asp.net asynchronous async-await

11
推荐指数
1
解决办法
4472
查看次数

标签 统计

.net ×1

asp.net ×1

async-await ×1

asynchronous ×1

c# ×1