2011-02-11 35 views
10

我最近加入微軟統一到我的MVC3項目,現在我得到這個錯誤:問題與自定義控制器工廠

The controller for path '/favicon.ico' could not be found or it does not implement 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; 
} 

}

有什麼建議?

提前致謝!

回答

29

這與您的控制器工廠沒有任何關係,但它是您可以輕鬆解決的問題。

如果您使用的是Webkit瀏覽器(Chrome特別是Safari,我認爲),對任何網站的請求都會自動附帶對「/favicon.ico」的請求。瀏覽器正試圖找到一個快捷方式圖標來伴隨您的網站和(無論什麼原因)默認快捷方式圖標的路徑已標準化爲'/favicon.ico'。

爲避免你得到的錯誤,只是你的MVC Web應用程序的路由表中定義一個IgnoreRoute():

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

這將確保任何請求「/favicon.ico」(或'/favicon.gif')將不會由MVC處理。

+0

非常感謝彌敦道!這實際上是:) – Kassem 2011-02-11 22:39:13

0

我已經看到這種情況還有:

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