Ninject горе ... 404 ошибки ошибок - PullRequest
4 голосов
/ 23 марта 2010

Мы используем любимый Ninject + Ninject.Web.Mvc с MVC 2 и столкнулись с некоторыми проблемами. Конкретно имеем дело с 404 ошибками. У нас есть служба регистрации, которая регистрирует 500 ошибок и записывает их. Все идет очень хорошо, за исключением случаев, когда мы пытаемся войти в несуществующий контроллер. Вместо того, чтобы получить желаемое значение 404, мы получаем ошибку 500:

Cannot be null
Parameter name: service
[ArgumentNullException: Cannot be null
Parameter name: service]
   Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional) +188
   Ninject.ResolutionExtensions.TryGet(IResolutionRoot root, Type service, IParameter[] parameters) +15
   Ninject.Web.Mvc.NinjectControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +36
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +68
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +118
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +46
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +63
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +13
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8679426
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Я провел некоторый поиск и обнаружил некоторые похожие проблемы, но эти 404 проблемы, похоже, не связаны. Любая помощь здесь будет отличной.

Спасибо! Джош

Ответы [ 2 ]

4 голосов
/ 25 марта 2010

РЕДАКТИРОВАТЬ: теперь это в стволе для MVC2: http://github.com/enkari/ninject.web.mvc

controllerType теперь принимает значение NULL, мы можем передать его на базу и позволить 404 произойти правильно:

        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if(controllerType == null)
        {
            // let the base handle 404 errors with proper culture information
            return base.GetControllerInstance(requestContext, controllerType);
        }

        var controller = Kernel.TryGet(controllerType) as IController;

        if (controller == null)
            return base.GetControllerInstance(requestContext, controllerType);

        var standardController = controller as Controller;

        if (standardController != null)
            standardController.ActionInvoker = CreateActionInvoker();

        return controller;
    }
2 голосов
/ 25 марта 2010

Необходимо изменить исходный код NinjectControllerFactory.cs, добавив 404. Я добавил исходный код для всех, кто интересуется исправлением:

    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 " +
                         "or it does not implement IController.",
                         requestContext.HttpContext.Request.Path));

        var controller = Kernel.TryGet(controllerType) as IController;

        ...
...