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).
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?
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.
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>
My trade off was to append /end to the end of route. .'s are ignored before the last /.
The equivalent URL would be http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll/end.
The benefit being that you don't get a performance hit on your assets.
来源:https://stackoverflow.com/questions/14664488/asp-net-mvc4-webapi-route-with-file-name-in-it