c# - 使用 CaSTLe Windsor 的异步 MVC 操作

标签 c# asp.net-mvc async-await castle-windsor

我有一个使用 CaSTLe Windsor ( http://www.artisancode.co.uk/2014/04/integrating-windsor-castle-mvc/) 的 MVC5 应用程序。我最近尝试在 MVC Controller 中添加异步方法。当我这样做时,我收到以下错误消息:

异步操作方法“test”返回一个无法同步执行的任务。

我在 VS 中创建了一个新的 MVC 应用程序但没有收到错误,所以我猜我在 CaSTLe Windsor 配置中遗漏了一些东西?但是我不知道从哪里开始,而且我一直找不到任何有帮助的文章。

用代码更新问题:

CaSTLeWindsorActionInvoker.cs

public class CastleWindsorActionInvoker : ControllerActionInvoker
    {
        private readonly IKernel kernel;

        public CastleWindsorActionInvoker(IKernel kernel)
        {
            this.kernel = kernel;
        }

        protected override ActionExecutedContext InvokeActionMethodWithFilters(ControllerContext controllerContext, IList<IActionFilter> filters, ActionDescriptor actionDescriptor, IDictionary<string, object> parameters)
        {
            foreach(IActionFilter filter in filters)
            {
                kernel.InjectProperties(null, filter);
            }

            return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters);
        }

        protected override AuthorizationContext InvokeAuthorizationFilters(ControllerContext controllerContext, IList<IAuthorizationFilter> filters, ActionDescriptor actionDescriptor)
        {
            foreach(IAuthorizationFilter filter in filters)
            {
                Type type = filter.GetType();

                IEnumerable<INamedInstanceAttribute> namedInstanceAttributes = type.GetCustomAttributes(typeof(INamedInstanceAttribute), false) as IEnumerable<INamedInstanceAttribute>;

                if(namedInstanceAttributes != null)
                {
                    this.kernel.InjectProperties(namedInstanceAttributes, filter);
                }
                else
                {
                    this.kernel.InjectProperties(null, filter);
                }
            }

            return base.InvokeAuthorizationFilters(controllerContext, filters, actionDescriptor);
        }
    }

WindsorDependencyMvcResolver.cs

public class WindsorDependencyMvcResolver : System.Web.Mvc.IDependencyResolver
    {
        public IWindsorContainer container { get; protected set; }

        public WindsorDependencyMvcResolver(IWindsorContainer container)
        {
            if(container == null)
            {
                throw new ArgumentNullException("container");
            }

            this.container = container;
        }

        public object GetService(Type serviceType)
        {
            try
            {
                return container.Resolve(serviceType);
            }
            catch(ComponentNotFoundException)
            {
                return null;
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return container.ResolveAll(serviceType).Cast<object>();
        }
    }

CaSTLeWindsorMvcFactory .cs

public class CastleWindsorMvcFactory : DefaultControllerFactory
    {
        private readonly IKernel kernel;

        public CastleWindsorMvcFactory(IKernel kernel)
        {
            this.kernel = kernel;
        }

        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if(controllerType == null)
            {
                throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
            }

            Controller controller = (Controller)kernel.Resolve(controllerType);

            if(controller != null)
            {
                controller.ActionInvoker = kernel.Resolve<IActionInvoker>();
            }

            return controller;
        }

        public override void ReleaseController(IController controller)
        {
            kernel.ReleaseComponent(controller);
        }
    }

全局.asax

ControllerBuilder.Current.SetControllerFactory(new CastleWindsorMvcFactory(container.Kernel));

DependencyResolver.SetResolver(new WindsorDependencyMvcResolver(container));

MVC Action

public async Task<ActionResult> Index()
        {
            return View();
        }

最佳答案

我正在做其他事情并遇到了这个 article .基于它,我将我的 CaSTLeWindsorActionInvoker 更改为从 AsyncControllerActionInvoker 继承,并且我能够运行我的异步操作。

感谢所有建议!

关于c# - 使用 CaSTLe Windsor 的异步 MVC 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31910625/

相关文章:

c# - 检测驱动器中 DVD 插入的最佳方法 C#

javascript - 让 React 在长时间运行的任务之间渲染页面

python - 如何将 SQLAlchemy 结果行转换为嵌套的字典

javascript - rxjs 在 map Rx.Observable.range(1, 5).map 中使用 async/await

c# - Asp Net Identity - 声明与自定义 IdentityUser

c# - net5 自包含 exe 缺少一些系统 DLL

c# - ASP.NET Core Web App DI 错误 - 无法构造某些服务(验证服务描述符时出错

javascript - ajax 可以使 Web 应用程序有状态吗?

javascript - Kendo Grid 中的日期字段在 Controller 上为空

c# - 当页面长时间打开时,JQuery ajax 调用中断