Marcus
Marcus

Reputation: 8649

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;

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

Upvotes: 2

Views: 782

Answers (2)

davidmdem
davidmdem

Reputation: 3823

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.

Upvotes: 4

snow_FFFFFF
snow_FFFFFF

Reputation: 3301

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.

Upvotes: 0

Related Questions