Я работаю в приложении MVC5, которое будет обрабатывать некоторые интенсивные операции ввода-вывода. Таким образом, мы используем методы преобразования async/wait TPL.MVC 5 Task Parallel и ActionInvoker
До асинхронного/ждать изменений Я зарегистрировал обычай IAsyncActionInvoker который изменяет JSon ActionResult к JsonNet ActionResult как в этом примере:
Using JSON.NET as the default JSON serializer in ASP.NET MVC 3 - is it possible?
Проблема возникает, когда изменения в использовании асинхронного/Await Задача, в которой JSONNET ActionResult никогда не выполняется. Кто-нибудь знает, как поддерживать эту реализацию при переходе на async/wait Task?
public class CustomActionInvoker : AsyncControllerActionInvoker
{
protected override ActionResult InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary<string, object> parameters)
{
ActionResult invokeActionMethod = base.InvokeActionMethod(controllerContext, actionDescriptor, parameters);
if (invokeActionMethod is JsonResult)
{
return new JsonNetResult(invokeActionMethod as JsonResult);
}
return invokeActionMethod;
}
}
public class HomeController : Controller
{
// THIS WORKS!
public ActionResult Test()
{
return Json(new
{
Property1 = "blah",
Property2 = "test"
}, JsonRequestBehavior.AllowGet);
}
// THIS DOES NOT FIRE MY CUSTOM ACTION INVOKER
// IT RUNS THE DEFAULT
public async Task<ActionResult> Test()
{
await Task.Run(() =>
{
Thread.Sleep(1000);
});
return Json(new
{
Property1 = "blah",
Property2 = "test"
}, JsonRequestBehavior.AllowGet);
}
}
Любая помощь была бы признательна ребятам!
Вы пробовали переопределить BeginInvokeActionMethod и EndInvokeActionMethod на вашем CustomActionInvoker? – danludwig
Я только что увидел, что после прочтения этого комментария, попытаюсь переопределить обоих и посмотреть, получу ли я ожидаемый результат, спасибо! @danludwig –
Я бы ответил на это, но, по-видимому, я не могу, поэтому после того, как @danludwig прокомментировал мой вопрос, я нашел правильный ответ. Я предположил, что, поскольку методы Begin/End Asynchronous считаются «старыми» в пользу методов async/await TPL, которые реализуют шаблон async/await, не позволят нам переопределить методы Begin/End InvokeActionMethod в AsyncControllerActionInvoker (думал, что это было только для обратной совместимости). Итак, ответ заключается в переопределении EndInvokeActionMethod. –