I'm getting a "Does not implement IController" error on images and robots.txt in MVC2

asp.net MvcExceptionRouting

asp.net Mvc Problem Overview


I'm getting a strange error on my webserver for seemingly every file but the .aspx files.

Here is an example. Just replace '/robots.txt' with any .jpg name or .gif or whatever and you'll get the idea:

> The controller for path '/robots.txt' > was not found or does not implement > IController.

I'm sure it's something to do with how I've setup routing but I'm not sure what exactly I need to do about it.

Also, this is a mixed MVC and WebForms site, if that makes a difference.

asp.net Mvc Solutions


Solution 1 - asp.net Mvc

You can ignore robots.txt and all the aspx pages in your routing.

routes.IgnoreRoute("{*allaspx}", new {allaspx=@".*\.aspx(/.*)?"});
routes.IgnoreRoute("{*robotstxt}", new {robotstxt=@"(.*/)?robots.txt(/.*)?"});

You might want to ignore the favicon too.

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

You can adjust the regular expression to exclude paths.

Haacked from the source.

Solution 2 - asp.net Mvc

The ignore route given above didn't work for me but I found a similar one that did:

routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(css|js|gif|jpg)(/.*)?" });

Solution 3 - asp.net Mvc

This error could also happen if inside a view in your area, you use the Html.Action helper. This helper will always use the area as a prepend, unless you specifically tell it not to. E.g.,

@Html.Action("Main", "Navigation", new { area = string.Empty })

Solution 4 - asp.net Mvc

I found another solution too... While I don't think I'll use it, it's worth showing here in the answers:

The following should (in theory) ignore looking for controllers for anything with a '.' in it.

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" },  // Parameter defaults
    new { controller = @"[^\.]*" }                          // Parameter contraints.
);

Solution 5 - asp.net Mvc

Do you still have:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

... in your Global.asax.cs?

MVC puts it there by default, and it's supposed to handle this.

If you do, then the problem may be how you're mixing MVC and WebForms.

Solution 6 - asp.net Mvc

I encountered this error when I request resources that did not exist.

Specifically, I was requesting a custom IE css file:

> <!--[if lt IE 8]>@Styles.Render("~/Content/ie7.css")<![endif]-->

(These are condition comments, interpreted by IE)

However, the actual resource existed on ~/Content/ie/ie7.css.

So, without any modifications to the routing, the error was solved by using the correct url of the resource.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBen LeshView Question on Stackoverflow
Solution 1 - asp.net MvcDaniel A. WhiteView Answer on Stackoverflow
Solution 2 - asp.net MvcThe CoderView Answer on Stackoverflow
Solution 3 - asp.net MvcDanielView Answer on Stackoverflow
Solution 4 - asp.net MvcBen LeshView Answer on Stackoverflow
Solution 5 - asp.net MvcCraig StuntzView Answer on Stackoverflow
Solution 6 - asp.net MvcR. SchreursView Answer on Stackoverflow