ApiController returns 404 when ID contains period
Asked Answered
H

3

59

I have an ApiController and I want to use email addresses as the ID parameter for requests:

// GET api/employees/[email protected]
public CompactEmployee Get(string id) {
   var email = id;
   return GetEmployeeByEmail(email);
}

However, I cannot get this to work (returns 404):

http://localhost:1080/api/employees/[email protected]

The following all work:

  • http://localhost:1080/api/employees/employee@company
  • http://localhost:1080/api/employees/employee@company.
  • http://localhost:1080/api/[email protected]

I have set relaxedUrlToFileSystemMapping="true" in my web.config as detailed by Phil Haack.

I would very much love the full email address to work, but any time the period is followed by any other character, the request returns a 404. Any help would be greatly appreciated!

Solution

Due to a lack of other options, I've headed in the direction Maggie suggested and used the answer from this question to create a rewrite rule to automatically append a trailing slash when I need an email in the URL.

<system.webServer>
  ....   
  <rewrite>
    <rules>
      <rule name="Add trailing slash" stopProcessing="true">
        <match url="^(api/employees/.*\.[a-z]{2,4})$" />
        <action type="Rewrite" url="{R:1}/" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>
Harvin answered 8/11, 2012 at 21:58 Comment(3)
Also see similar question: #11729346Blabbermouth
Thank you @Jonathan-Freeland, this solved my same issue. I'm left shaking my head that Microsoft thought this was a good design. Any other web framework worth its salt would let you quickly and easily configure static / dynamic URLs with a regex or anything other than assuming a period always means a static file and causing developers to jump through hoops to work around this assumption. What an unnecessary time waster.Marvelmarvella
Thanks @Jonathan-Freeland! I was in a situation where I couldn't change the client but just needed to add the darn slash at the end, your solution worked perfectly for meSchipperke
L
84

Would adding a trailing slash work for your scenario?

http://localhost:33021/api/employees/[email protected]/
Ludovico answered 8/11, 2012 at 22:33 Comment(3)
It does, but would love to avoid this if possible.Harvin
Can anybody do a quick write up on why adding the Slash Forces Asp.net to skip the handlers that tries to load Extension Oriented Resources?Headwards
Does fix the issue, but I have get the 404 on one server deploy, and the expected response from another deployment for the same code base. So there is another underlying configuration issue where, if configured correctly, the trailing slash is not required.Stetson
B
2

Check your IIS settings:

Home Directory -> Configuration

Edit the .aspx application extension and ensure that the setting Verify that file exists is off.

UPDATE

I've just tested with a default MVC4 Web API project

URL: http://localhost:10983/api/values/[email protected]

Action in ValuesController:

public string Get(string id)
{
    return id;
}

This was the response:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">[email protected]</string>
Blabbermouth answered 8/11, 2012 at 23:54 Comment(2)
Hi, I'm curious to know if you checked this as it's been an issue for me in the past (honestly - just curious). Thx.Blabbermouth
Embarrassingly no. But I have now (and it worked, although TBH I didn't expect it to). Will update my answer. ThxBlabbermouth
D
1

This is what worked for me:

I was running on targetFramework = 4.6.1. I have upgraded to 4.6.2 and added this in web.config:

<system.web>
        <customErrors mode="Off"/>
        <compilation debug="true" targetFramework="4.6.2"/>
        <!-- This will allow to search for stuff that contains . & etc.-->
        <httpRuntime targetFramework="4.6.2" maxRequestLength="100000" maxUrlLength="2048" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters=""/>
  </system.web>

The requestPathInvalidCharacters="" is to be able to have stuff like & etc in URI, in encoded form, of course.

Duodiode answered 11/9, 2018 at 23:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.