Я получаю мои ноги мокрыми, используя async/await, и большинство из того, что я читал, состояния «Не блокировать асинхронный код», за исключением основной функции в консольном приложении. Я не могу следовать этому простому правилу :(Как обращаться с вызовами асинхронного API с помощью CMS, который не позволяет выполнять действия контроллера Async?
Мое приложение сильно зависит от уровня WebAPI. Клиент, который я использую в приложении MVC, использует методы async на System.Net.Http.HttpClient
, чтобы вызвать методы API. В настоящее время я обрабатываю его два пути в некоторых местах мы сразу же получать результат после вызова клиента:..
//WebAPI Client
public object GetSomething(int id)
{
var task = _client_GetSomethingFromApiAsync(id);
var result = task.Result;
return result;
}
в других, используя асинхронную весь путь до контроллера я использую SiteFinity и не могу использовать асинхронное действие контроллера, так что я в конечном итоге с чем-то вроде этого:
//WebAPI Client
public Task<object> GetSomethingAsync(int id)
{
return _client_GetSomethingFromApiAsync(id);
}
//Domain Service
public Task<object> GetSomethingDomainServiceAsync(int id)
{
return _service.GetSomethingAsync(id);
}
//Controller
public JsonResult GetSomethingControllerAction(int id)
{
var result = _domainService.GetSomethingDomainServiceAsync(viewModel.id).Result;
return Json(new { Success = true, Payload = result });
}
Основываясь на моем исследовании, оба этих решения не идеальны, хотя у меня не было никаких проблем с взаимоблокировками, и все, кажется, работает. Может кто-то, пожалуйста, помогите мне понять лучший образец, за которым я должен следовать и объяснить почему?
Спасибо!
Большая статья, спасибо! – Mike
Решил добавить как асинхронные, так и синхронные методы к моему клиенту API. Например, GetAsync будет использовать HttpClient, а Get будет использовать WebClient. – Mike