【问题标题】:Problem with custom controller factory自定义控制器工厂的问题
【发布时间】:2011-02-11 22:26:26
【问题描述】:

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

找不到路径“/favicon.ico”的控制器,或者它没有实现 IController。

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

公共类 UnityControllerFactory : DefaultControllerFactory { 统一容器容器;

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

}

有什么建议吗?

提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

    如果您使用的是 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”)的任何请求。

    【讨论】:

    • 非常感谢内森!确实做到了:)
    • 我在 Global.asax 中使用了这段代码,现在 Chrome 中出现“文件不存在”异常。
    【解决方案2】:

    我也见过这样的做法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      相关资源
      最近更新 更多