参数返回 404 的 WebAPI 路由属性

WebAPI Route attribute with parameters returning 404

我可以在 Fiddler 中看到相应的 HttpRequest,但从未调用 Controller 方法,但请求似乎被拦截并返回 404。适当调用其他控制器方法。

HttpRequest

GET http://localhost:36696/test/file/69946/FF47F87FE63E6C24644631FAEA15B157/file.pdf HTTP/1.1
Host: localhost:36696
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.99 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,sv;q=0.6

控制器方法

[Route("test/file/{fileId:int}/{hash}/file.pdf")]
public HttpResponseMessage GetFile(int fileId, string hash)
{
    [..]
}

问题;

出于隐私考虑,我不能 post 整个 web.config,但文件中没有 httpHandlersmimeType 条目。

问题是“.”在路线中。 Web 配置中的以下内容将允许它:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    ...
</system.webServer>

我还应该补充一点,似乎还有其他 web.config 条目也会对此产生影响。这只是我用来解决这个问题的方法。搜索 "webapi routing with dot" 应该会向您显示其他解决方案以及更深入的解释。

IIS 认为它正在寻找静态文件,而不是 运行通过托管管道发送请求。

将此条目添加到 <handlers> 下的 web.config 将告诉 IIS 运行 这些请求通过 routes/managed 管道。

   <add
        name="ManagedPDFExtension"
        path="test/file/*/*/*.pdf"
        verb="GET"
        type="System.Web.Handlers.TransferRequestHandler"
        preCondition="integratedMode,runtimeVersionv4.0" />

我在 path 中非常明确地包含了路由,这样它就不会 运行 通过完整的 .NET 管道的所有静态内容。如果您有很多这样的端点或以这种方式提供所有文件,那么您可以使用更通用的路径模式。