Я использую асинхронный метод "Post" сервиса отдыха webApi:
public async Task<object> Post([FromBody]string data)
{
object response = ExecuteServerLogics(data);
return response;
}
Приведенный выше код работал хорошо, но при некоторых обращениях клиента мы испытывали проблемы с производительностью.
Прочитав здесь несколько статей, я заметил, что наша служба отдыха webApi на самом деле не работает асинхронно со своими входящими веб-запросами, потому что мы забыли использовать шаблон async / await:
public async Task<object> Post([FromBody]string data)
{
object response = await Task<object>.Run( () =>
{
return ExecuteServerLogics(data);
});
return response;
}
После этого исправления мы заметили, что производительность улучшилась, но мы обнаружили еще одну проблему критиков: при доступе к HttpContext.Current он возвращает пустую ссылку:
public async Task<object> Post([FromBody]string data)
{
object response = await Task<object>.Run( () =>
{
var currentContext = HttpContext.Current; // Returns Null!
return ExecuteServerLogics(data);
});
return response;
}
Мы пытались найти решение для этого, и в большинстве сообщений мы обнаружили, что мы должны передать ссылку HttpContext рабочего потока во внутреннюю задачу, которая выполняет логику сервера. Проблема с этим решением заключается в том, что методы логики сервера используют множество статических классов, которые используют "HttpContext.Current", например:
- Регистраторы звонят.
- статические классы безопасности, которые извлекают user.identity
- статические классы безопасности, которые извлекают данные сеанса входящего запроса и т. д.
Следовательно, передача ссылки «HttpContext.Current» рабочего потока не решит эту проблему.
Когда мы попробовали следующее решение:
public async Task<object> Post([FromBody]string data)
{
// Save worker context:
var currentContext = HttpContext.Current;
object response = await Task<object>.Run( () =>
{
// Set the context of the current task :
HttpContext.Current = currentContext ; // Causes the calls not to work asynchronously for some reason!
// Executes logics for current request:
return ExecuteServerLogics(data);
});
return response;
}
по какой-то причине мы заметили, что производительность снова ухудшилась, как будто она снова вернулась к работе синхронно.
Наши проблемы:
1. Почему в последнем примере установка "HttpContext.Current" внутри задачи ожидания приводит к тому, что запросы возвращают такие же плохие результаты производительности, которые похожи на синхронные результаты?
2. Есть ли другой способ использования «HttpContext.Current» внутри вызывающей внутренней задачи - «ExecuteServerLogics» и во всех статических классах, которые также вызывают "HttpContext.Current"? я как-то неправильно делаю весь дизайн?
Спасибо!