Почему на HomeController ссылаются и как мне его поддерживать (если я должен)?

Это своего рода Helleresque (Catch-22) ситуация; или, может быть, более уместно, "не хранилище, если я делаю, и не хранилище, если я не делаю"

С этим замком Windsor Controller Factory:

public class WindsorControllerFactory : DefaultControllerFactory
{
    private readonly IKernel _kernel;

    public WindsorControllerFactory(IKernel kernel)
    {
        _kernel = kernel; 
        //According to http://docs.castleproject.org/Windsor.Typed-Factory-Facility.ashx, might need this:
        //_kernel.AddFacility<TypedFactoryFacility>(); // This breaks ("Typed factory facility already registered"), so commenting it out; see http://stackru.com/questions/20914635/how-do-i-connect-the-various-pieces-of-my-web-api-castle-windsor-di-code
        //but that requires uncommenting the "TypedFactory" using above.
    }

    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));
        }
        return (IController)_kernel.Resolve(controllerType);
    }

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

}

Если эта строка жива:

_kernel.AddFacility<TypedFactoryFacility>();

... я получаю это исключение во время выполнения: " TypedFactoryFacility" уже зарегистрирован в контейнере "

... Если я закомментирую эту строку, я получу следующее исключение:

" Не найдено ни одного компонента для поддержки службы HandheldServer.Controllers.HomeController "

... в этой строке:

return (IController)_kernel.Resolve(controllerType);

Почему на HomeController ссылаются и как мне его поддерживать (если я должен)?

HomeController - это класс по умолчанию, который выглядит следующим образом:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = "Home Page";

        return View();
    }
}

Должен ли я избавиться от HomeController? Или же...???

ОБНОВИТЬ

Я изменил HomeController из этого:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = "Home Page";

        return View();
    }
}

...к этому:

public class HomeController : ApiController
{
}

И теперь исключение времени выполнения я получаю здесь:

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

... is: " Исключение System.Web.HttpException не было обработано кодом пользователя HResult=-2147467259 Сообщение = Не найден контроллер для пути '/'. Source=HandheldServer ErrorCode=-2147467259 WebEventCode=0 StackTrace: at HandheldServer.DIPlumbing С.MvcHandler.ProcessRequestInit(HttpContextBase, httpContext, IController& controller, IControllerFactory& factory) в System.Web.Mvc.MvcHandler.BeginProcessRequest(обратный вызов HttpContextBase httpContext, AsyncCallback., Состояние объекта) в System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest (контекст HttpContext, AsyncCall back cb, Object extraData) в System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () "

1 ответ

Решение

Проверьте, что ваша маршрутизация не ссылается на домашний контроллер.

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
Другие вопросы по тегам