Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 参数返回404的WebAPI路由属性_C#_Asp.net Web Api_Asp.net Web Api Routing - Fatal编程技术网

C# 参数返回404的WebAPI路由属性

C# 参数返回404的WebAPI路由属性,c#,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api Routing,我可以在Fiddler中看到相应的HttpRequest,但从未调用控制器方法,但请求似乎被拦截,并返回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 Accep

我可以在Fiddler中看到相应的
HttpRequest
,但从未调用控制器方法,但请求似乎被拦截,并返回
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)中

出于隐私考虑,我无法发布整个
web.config
,但文件中没有
httpHandlers
mimeType
条目。

问题在于路由中的“.”。web配置中的以下内容将允许:

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

...

我还应该补充一点,似乎还有其他web.config条目也会影响这一点。这就是我用来解决这个问题的方法。搜索“带点的webapi路由”应该会向您展示其他解决方案,并提供更深入的解释。

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

将此条目添加到
下的web.config将告诉IIS通过路由/托管管道运行这些请求

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


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

谢谢您的输入,但这实际上是一个糟糕的想法——“一切顺利”——使所有ASP.NET模块能够针对我的应用程序中的每个请求运行,而不管“managedHandler”的前提条件是什么,呈现可能的安全漏洞…马库斯-我刚刚编辑了我的答案。再说一遍,“.”是你的问题。如前所述,似乎有很多方法可以解决这个问题——上述方法确实有效,但您也应该能够找到其他方法。就个人而言,如果你不需要“.”,我会改变你的路线。这实际上是我在阅读你的答案前几秒钟选择的解决方案。谢谢你的确认!