Почему пользовательский контекст олицетворения доступен только до тех пор, пока не будет вызван метод async? Я написал некоторый код (фактически основанный на веб-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;
}
К моему удивлению, в этой ситуации я получу имя пользователя приложения. под которым работает код. Это означает, что у меня больше нет контекста пользователя. Если задержка изменяется на 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;
}
Код вернет имя текущего пользователя. Насколько я понимаю, ожидание и то, что показывает отладчик, context.Dispose() не вызывается до тех пор, пока не будет назначено имя.