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.<
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.
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");