参数返回 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)
{
[..]
}
问题;
如何正确设置路由 (System.Web.HttpRouteAttribute
)
嵌入参数?
是否有任何默认过滤器禁止我访问 PDF 文件?
这是在 IIS Express (VS2013)
出于隐私考虑,我不能 post 整个 web.config
,但文件中没有 httpHandlers
或 mimeType
条目。
问题是“.”在路线中。 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 管道的所有静态内容。如果您有很多这样的端点或以这种方式提供所有文件,那么您可以使用更通用的路径模式。
我可以在 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)
{
[..]
}
问题;
如何正确设置路由 (
System.Web.HttpRouteAttribute
) 嵌入参数?是否有任何默认过滤器禁止我访问 PDF 文件? 这是在 IIS Express (VS2013)
出于隐私考虑,我不能 post 整个 web.config
,但文件中没有 httpHandlers
或 mimeType
条目。
问题是“.”在路线中。 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 管道的所有静态内容。如果您有很多这样的端点或以这种方式提供所有文件,那么您可以使用更通用的路径模式。