MVC:favicon.ico也会寻找控制器吗?

66

我遇到了一个错误:

“路径 '/favicon.ico' 的控制器未找到或未实现 IController 接口”

然后我想:框架如何知道哪些文件需要实例化控制器,因为脚本、CSS和其他文件也是一样的吗?

(以前从来没有想过,但现在收藏夹在抱怨,我在想...)

但回到错误,为什么会发生这种情况?


2
可能是Serving favicon.ico in ASP.NET MVC的重复问题。 - codingbadger
5个回答

111

将以下代码添加到您的global.asax文件中:

routes.IgnoreRoute("favicon.ico");

4
谢谢,非常有效。我一直在使用ELMAH但是它一直给我一个错误。为了确保ELMAH不出现有关favicon.ico的错误,请确保在您网站的根文件夹中也添加文件“favicon.ico”。 - mateuscb

19

你也可以通过约束条件来指定忽略的路由

routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

在使用简单的 routes.IgnoreRoute("favicon.ico"); 已经足够的情况下,使用复杂的方法是否有合理性?也许某些浏览器会尝试自动获取网站图标,并使用一些奇怪的 URL? - ANeves
3
简单的方法只有在将favicon.ico放置在网站根目录下,正如@mateuscb在他的评论中指出的那样才能起作用。然而,如果像https://dev59.com/_HRB5IYBdhLWcg3w3K0J中所描述的那样将其放置在其他地方,则需要采用更复杂的方法。 - yoel halb
1
任何使用此代码片段的人都应该知道,由于我们正在处理一个实例而不是类型,因此“routes”应该是小写字母,存在语法错误。 - yoel halb
2
@yohal - 哎呀 - 根据 http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx 修复了它。 - Nicholas Murray

15

顶部答案是正确的。

routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

但对于较新版本的MVC,您必须将此添加到 RouteConfig.cs 中的 RegisterRoutes 方法的顶部(因此在调用routes.MapRoute(..)之前的某个位置)。


3

你可能是在使用VS web服务器时遇到这个问题,对吗?

如果使用IIS,就不会出现这个问题,因为IIS(默认情况下)处理图片文件的请求(.ico,.jpg,.gif等),所以它们不会传递到你的应用程序中。


我的第一反应是“是”,但实际上它也可以在IIS6 + Win2003上运行。 - Michel
1
同样适用于IIS 7。您还必须添加ignoreroute以忽略favicon和robots.txt。 - James Reategui
2
IIS 7有这个“集成管道”(integrated pipeline)的东西,在其中HTTP处理程序可以处理几乎任何访问站点的URL,如果我没记错的话。 - cHao

0

听起来很有趣,但只有在我勾选了“启用仅限我的代码”选项(在工具->选项->调试下)时,才会出现此错误。一旦取消勾选,我就不再遇到这个错误。

请注意,似乎错误仍然在后台抛出,但立即在内部被捕获,因此最好的解决方案是在global.asax中编写代码以忽略它,正如其他答案所建议的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接