简体   繁体   中英

WebAPI Route attribute with parameters returning 404

I can see the appropriate HttpRequest in Fiddler but the Controller method is never invoked but the request seems to be intercepted and a 404 is returned. Other controller methods are invoked appropriately.

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

Controller method

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

Questions;

  • How do I properly set the Route ( System.Web.HttpRouteAttribute ) with embedded parameters?

  • Is there any default filter prohibiting me from accessing PDF files? This is in IIS Express (VS2013)

I cannot post the entire web.config for privacy concerns but there are no httpHandlers or mimeType entries in the file.

IIS thinks that it is looking for a static file and is not running the request through the Managed Pipeline.

Adding this entry to the web.config under <handlers> will tell IIS to run these requests through the routes/managed pipeline.

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

I included the route pretty specifically in the path so that it doesn't run all of your static content through the full .NET pipeline. If you have lot of these endpoints or serve all files in this way then you can use a more generic path pattern.

The issue is the "." in the route. The following in the web config will allow it:

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

I should also add that there appear to be other web.config entries that can affect this as well. This is just the one I have used to solve this problem. A search for "webapi routing with dot" should show you other solutions with deeper explanations as well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM