У меня очень простой контроллер ASP.NET MVC 4:
public class HomeController : Controller
{
private const string MY_URL = "http://smthing";
private readonly Task<string> task;
public HomeController() { task = DownloadAsync(); }
public ActionResult Index() { return View(); }
private async Task<string> DownloadAsync()
{
using (WebClient myWebClient = new WebClient())
return await myWebClient.DownloadStringTaskAsync(MY_URL)
.ConfigureAwait(false);
}
}
Когда я запускаю проект, я вижу свое представление, и оно выглядит нормально, но когда я обновляю страницу, я получаю следующую ошибку:
[InvalidOperationException: асинхронный модуль или обработчик завершен, пока асинхронная операция все еще выполняется.]
Почему это происходит? Я сделал пару тестов:
- Если мы удалим
task = DownloadAsync();
из конструктора и поместим его в методIndex
, он будет работать без ошибок. - Если мы используем другое тело
DownloadAsync()
bodyreturn await Task.Factory.StartNew(() => { Thread.Sleep(3000); return "Give me an error"; });
, он будет работать правильно.
Почему невозможно использовать метод WebClient.DownloadStringTaskAsync
внутри конструктора контроллера?