2014-02-03 2 views
1

Я работаю в приложении 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); 
    } 
} 

Любая помощь была бы признательна ребятам!

+0

Вы пробовали переопределить BeginInvokeActionMethod и EndInvokeActionMethod на вашем CustomActionInvoker? – danludwig

+0

Я только что увидел, что после прочтения этого комментария, попытаюсь переопределить обоих и посмотреть, получу ли я ожидаемый результат, спасибо! @danludwig –

+1

Я бы ответил на это, но, по-видимому, я не могу, поэтому после того, как @danludwig прокомментировал мой вопрос, я нашел правильный ответ. Я предположил, что, поскольку методы Begin/End Asynchronous считаются «старыми» в пользу методов async/await TPL, которые реализуют шаблон async/await, не позволят нам переопределить методы Begin/End InvokeActionMethod в AsyncControllerActionInvoker (думал, что это было только для обратной совместимости). Итак, ответ заключается в переопределении EndInvokeActionMethod. –

ответ

0

Возвращаясь, чтобы ответить на этот вопрос, ответ заключается в том, чтобы переопределить InvokeActionMethod и EndInvokeActionMethod для обработки синхронных и асинхронных действий.

protected override ActionResult EndInvokeActionMethod(IAsyncResult asyncResult) 
{ 
    var actionResult = base.EndInvokeActionMethod(asyncResult); 
    if(actionResult is JsonResult) 
    { 
     return new JsonNetResult(actionResult as JsonResult); 
    } 
    return actionResult; 
} 
Смежные вопросы