Рассмотрим следующий обработчик делегирования веб-API ASP.NET:
public class MyHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var guid = Guid.NewGuid();
HttpContext.Current.Items["foo"] = guid;
// An Async operation
var result = await base.SendAsync(request, cancellationToken);
//All code from this point is not gauranteed to run on the same thread that started the handler
var restoredGuid = (Guid)HttpContext.Current.Items["foo"];
//Is this gauranteed to be true
var areTheSame = guid == restoredGuid;
return result;
}
}
Вышеприведенный пример относится к обработчику делегирования, та же проблема, которую я пытаюсь исправить, применяется в контроллерах, бизнес-объектах и т.д.
В конечном итоге я пытаюсь предоставить некоторое простое совместное состояние в памяти между различными объектами в HTTP-запросе
Как я понимаю, во время операций Async поток ASP.NET, первоначально запускающий операцию, возвращается в пул потоков, и для завершения запроса после завершения операции Async может использоваться другой поток.
Это влияет на коллекцию HttpContext.Current.Items
?
Является ли элемент, который был в коллекции Items
гарантированно присутствует, когда Запрос возобновляется?
-
Я знаю, что использование
HttpContext.Current
часто неодобрительно более широкое сообщество в наши дни по причинам, которые я полностью согласен с... Я просто помогаю кому-то из пробки. -
Сохранение этих данных в коллекции
Request.Items
не подходит для решения этой проблемы, так как мой коллега требует статичности из-за некоторых плохих проектных решений.
Большое спасибо