自定义控制器工厂的问题

时间:2011-02-11 22:26:27

标签: asp.net-mvc asp.net-mvc-3

我最近将Microsoft Unity添加到我的MVC3项目中,现在我收到了这个错误:

  

无法找到路径'/favicon.ico'的控制器,或者它没有实现IController。

我真的没有favicon.ico,所以我不知道它来自哪里。而最奇怪的是视图实际上正在呈现,然后这个错误被抛出......我不确定我的控制器工厂类是否有问题,因为我从一些教程得到了代码(我不是IoC - 这是我第一次这样做)。这是代码:

公共类UnityControllerFactory:DefaultControllerFactory {     IUnityContainer容器;

public UnityControllerFactory(IUnityContainer _container)
{
    container = _container;
}

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
    IController controller;

    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));

    if(!typeof(IController).IsAssignableFrom(controllerType))
        throw new ArgumentException(string.Format("Type requested is not a controller: {0}",
                                                            controllerType.Name),
                                                            "controllerType");
    try
    {
        controller = container.Resolve(controllerType) as IController;
    }
    catch (Exception ex)
    {
        throw new InvalidOperationException(String.Format(
                                "Error resolving controller {0}",
                                controllerType.Name), ex);
    }
    return controller;
}

}

有什么建议吗?

提前致谢!

2 个答案:

答案 0 :(得分:29)

这与您的控制器工厂无关,但您可以轻松解决这个问题。

如果您使用的是Webkit浏览器(特别是Chrome,我认为是Safari),对任何网站的请求将自动伴随对'/favicon.ico'的请求。浏览器正在尝试查找伴随您网站的快捷方式图标,并且(无论出于何种原因)快捷方式图标的默认路径已标准化为“/favicon.ico”。

为了避免您遇到的错误,只需在MVC Web应用程序的路由表中定义一个IgnoreRoute():

RouteTable.Routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.([iI][cC][oO]|[gG][iI][fF])(/.*)?" });

这将确保MVC不会处理对'/favicon.ico'(或'/favicon.gif')的任何请求。

答案 1 :(得分:0)

我也看到了这一点:

    catch (Exception ex)
{
    /*throw new InvalidOperationException(String.Format(
                            "Error resolving controller {0}",
                            controllerType.Name), ex);*/
    base.GetControllerInstance(requestContext,controllerType);
}