Question

Consider a StaticResourceController that locates and serves files.

I've set up an explicit route for "favicon.ico" that will handle the request for this file using StaticResourceController:

routes.MapRoute(
        "favicon",
        "favicon.ico",
        new { controller = "StaticResource", action = "Get", file = "favicon.ico", area="root"},
        new[] { "Dimebrain.Mvc.Controllers" }
        );

In IIS6 the expected result occurs when making a request for http://localhost:8080/favicon.ico.

Unfortunately when I deploy to IIS7 http://localhost/favicon.ico returns an IIS-generated 404, presumably because it's actually looking for the favicon.ico in the web root folder, where it doesn't exist.

I have enough happening in StaticResourceController that this isn't a good thing for my application, especially since it is multi-tenant and the favicon.ico file can change. I've set my web server modules to handle every request and override the RouteCollection to disregard file checks with RouteExistingFiles.

Why is the UrlRoutingModule getting in my way in IIS7 and forcing serving the static file from disk (404)?

Was it helpful?

Solution

In case anyone else runs into this problem, the solution is you need you to let MVC know not to process requests in folders where your actual static files live:

// Make sure MVC is handling every request for static files
routes.RouteExistingFiles = true;

// Don't process routes where actual static resources live
routes.IgnoreRoute("content/{*pathInfo}");
routes.IgnoreRoute("scripts/{*pathInfo}");
routes.IgnoreRoute("areas/admin/content/{*pathInfo}");
routes.IgnoreRoute("areas/admin/scripts/{*pathInfo}");

OTHER TIPS

In adiition to Daniel Crenna's answer, you need to add in web.confug file in system.webServer section:

<modules runAllManagedModulesForAllRequests="true"/>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow