2010-03-23 2 views
4

우리는 MVC 2와 함께 사랑하는 Ninject + Ninject.Web.Mvc를 사용 중이며 몇 가지 문제가 있습니다. 특히 404 오류를 처리합니다. 우리는 500 개의 오류를 기록하고 기록하는 로깅 서비스를 가지고 있습니다. 우리는 존재하지 않는 컨트롤러에 들어가려고 할 때를 제외하고는 모든 것을 완벽하게 따라 다니고 있습니다. 원하는 404를 얻는 대신에 500 오류가 발생합니다.Ninject Woes ... 404 오류 문제

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 문제는 관련성이없는 것으로 보입니다. 여기에 도움이 될 것입니다.

감사합니다. 조쉬

답변

4

편집 :이 MVC2 이제 트렁크에 있습니다 http://github.com/enkari/ninject.web.mvc

controllerType 이제 널오고, 우리는 기본에 전달하고 (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; 
    } 
+0

MVC를 사용하고 있습니다. 2 확장. –

+0

Ninject가 컨트롤러를 해결하지 못하고 DefaultControllerFactory로 넘겨줍니다. 그러면 DefaultControllerFactory가 나옵니다. 그러면 Ninjects에서 빠져 나옵니다. MS는 MVC2에서 404 오류를 처리하는 방법을 변경했을 수 있습니다. requesContext 또는 controllerType이 null입니까? –

+0

controllerType이 null이고 requestContext가 null입니다. –

2

404를 추가하여 NinjectControllerFactory.cs 소스 코드를 수정해야합니다. 수정에 관심있는 사람을위한 소스 코드를 추가했습니다 :