Question

I have a MVC controller called Downloads. http://mysite/Downloads

I also want to put a physical file in a physical folder called http://mysite/Downloads/MyFile.zip.

If I simply create a folder, I get a 403 when browsing to http://mysite/Downloads. (Most likely because of directory browsing is disabled) But I want the MVC controller to kick in instead.

How do I do that?

Was it helpful?

Solution

If you browse to http://mysite/Downloads/{ACTION} it will fire your controllers action.

The only thing that won't work in your example is the /Downloads with no action. You could re-write this URL to redirect you to your default action.

In addition, you will need to have the routehandler ignore your download files. You can add a line in your global.asax file to ignore all zip files or some other ignore pattern that suits.

routes.Ignore("{resource}.zip");

OTHER TIPS

Since .NET 3.5, you can route existing files:

public static void RegisterRoutes(RouteCollection routes) {
    routes.RouteExistingFiles = true;
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
       name: "Default",
       url: "{controller}/{action}/{id}",
       defaults: new { controller = "Home", 
                          action = "Index", 
                          id = UrlParameter.Optional }
    );
}

So suppose we had a folder on the site root called Markets containing an audio.mp3 file:

\Markets
\Markets\audio.mp3

Assuming the existence of a MarketsController, if we made a request for Markets, it'd be routed to Markets/Index.

If we requested /Markets/audio.mp3 we'd get the mp3 file and if we requested Markets/AnythingElse, normal routing would apply.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top