ASP.net MVC4 WebApi路由,其中​​包含文件名

Alx*_*ndr 33 asp.net asp.net-mvc asp.net-mvc-routing asp.net-web-api

我试图在我的ASP.net MVC4/WebApi项目中使用以下(和类似的)URL:

http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll
Run Code Online (Sandbox Code Playgroud)

负责此网址的路线如下所示:

        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 }
        );
Run Code Online (Sandbox Code Playgroud)

如果我删除它,它的工作正常.在文件名中,或者如果我在URL后面添加斜杠,但这也意味着我不能使用Url.Route-methods等.我得到的错误是一般的404错误(下图).

在此输入图像描述

我已经尝试添加<httpRuntime targetFramework="4.5" relaxedUrlToFileSystemMapping="true" />到我的web.config,我也尝试添加

<compilation debug="true" targetFramework="4.5">
  <buildProviders>
    <remove extension=".dll"/>
    <remove extension=".exe"/>
  </buildProviders>
</compilation>
Run Code Online (Sandbox Code Playgroud)

而且似乎没有任何效果.所以我的问题基本上是,如何让这个URL工作,并正确映射?

Dar*_*rov 50

您可以将以下处理程序添加到<handlers>您的部分<system.webServer>:

<add 
    name="ManagedDllExtension" 
    path="api/nav/*/*.dll" 
    verb="GET" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" 
/>
Run Code Online (Sandbox Code Playgroud)

这将使所有包含的请求.dll通过托管管道提供.另请注意我是如何将它们仅限于GET动词以限制性能影响.

  • 不,它没有覆盖它.您需要指定扩展名.如果URL中有扩展名,IIS将接管它认为它是一个静态文件. (2认同)

Alx*_*ndr 11

找到了.我需要的是什么(也许我在原帖中添加了一些内容):

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

  • 我不建议您添加此项,因为它会产生不良副作用=>所有请求现在都将通过托管管道,这将对您的应用程序的性能产生负面影响. (2认同)
  • 在不激活 `runAllManagedModulesForAllRequests="true"` 的情况下,查看我的答案以获取正确的方法。 (2认同)

kim*_*3er 5

我的权衡是附加/end到路线的末尾。.最后一个之前的被忽略/

等效的 URL 为http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll/end

好处是您的资产性能不会受到影响。