仅供参考,我为此向跟踪器添加了一个问题:
http://issues.umbraco.org/issue/U4-5208
有一个解决方法:
创建自定义异步渲染操作调用(如上所述):
public class FixedAsyncRenderActionInvoker : System.Web.Mvc.Async.AsyncControllerActionInvoker
{
protected override ActionDescriptor FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, string actionName)
{
var ad = base.FindAction(controllerContext, controllerDescriptor, actionName);
if (ad == null)
{
//check if the controller is an instance of IRenderMvcController
if (controllerContext.Controller is IRenderMvcController)
{
return new ReflectedActionDescriptor(
controllerContext.Controller.GetType().GetMethods()
.First(x => x.Name == "Index" &&
x.GetCustomAttributes(typeof(NonActionAttribute), false).Any() == false),
"Index",
controllerDescriptor);
}
}
return ad;
}
}
创建自定义渲染 mvc 控制器:
public class FixedAsyncRenderMvcController : RenderMvcController
{
public FixedAsyncRenderMvcController()
{
this.ActionInvoker = new FixedAsyncRenderActionInvoker();
}
}
创建自定义渲染控制器工厂:
public class FixedAsyncRenderControllerFactory : RenderControllerFactory
{
public override IController CreateController(RequestContext requestContext, string controllerName)
{
var controller1 = base.CreateController(requestContext, controllerName);
var controller2 = controller1 as Controller;
if (controller2 != null)
controller2.ActionInvoker = new FixedAsyncRenderActionInvoker();
return controller1;
}
}
创建一个 umbraco 启动处理程序并将必要的部分替换为上述自定义部分:
public class UmbracoStartupHandler : ApplicationEventHandler
{
protected override void ApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
DefaultRenderMvcControllerResolver.Current.SetDefaultControllerType(typeof(FixedAsyncRenderMvcController));
FilteredControllerFactoriesResolver.Current.RemoveType<RenderControllerFactory>();
FilteredControllerFactoriesResolver.Current.AddType<FixedAsyncRenderControllerFactory>();
base.ApplicationStarting(umbracoApplication, applicationContext);
}
}