Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.net MVC4 WebApi route with file-name in it

I'm trying to get the following (and similar) urls to work in my ASP.net MVC4/WebApi project:

http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll 

The route responsible for this url looks like this:

        config.Routes.MapHttpRoute(             name: "Nav",             routeTemplate: "api/nav/{project}/{assembly}/{namespace}/{type}/{member}",             defaults: new { controller = "Nav", assembly = RouteParameter.Optional, @namespace = RouteParameter.Optional, type = RouteParameter.Optional, member = RouteParameter.Optional }         ); 

It works just fine if I remove the . in the file-name, or if I add a slash behind the URL, but that also means I can't use the Url.Route-methods etc. The error I get is a generic 404-error (image below).

enter image description here

I've tried adding <httpRuntime targetFramework="4.5" relaxedUrlToFileSystemMapping="true" /> to my web.config, and I've also tried adding

<compilation debug="true" targetFramework="4.5">   <buildProviders>     <remove extension=".dll"/>     <remove extension=".exe"/>   </buildProviders> </compilation> 

And none of it seems to work. So my question is basically, how can I get this URL to work, and map correctly?

like image 702
Alxandr Avatar asked Feb 02 '13 17:02

Alxandr


2 Answers

You could add the following handler to the <handlers> section of your <system.webServer>:

<add      name="ManagedDllExtension"      path="api/nav/*/*.dll"      verb="GET"      type="System.Web.Handlers.TransferRequestHandler"      preCondition="integratedMode,runtimeVersionv4.0"  /> 

This will make all requests containing .dll be served through the managed pipeline. Also notice how I have limited them only to the GET verb to limit the performance impact.

like image 87
Darin Dimitrov Avatar answered Sep 28 '22 14:09

Darin Dimitrov


Found it. What's needed is this (and maybe some of the things I've added above in the original post):

<system.webServer>   <modules runAllManagedModulesForAllRequests="true" /> </system.webServer> 
like image 40
Alxandr Avatar answered Sep 28 '22 13:09

Alxandr