web-dev-qa-db-fra.com

ApiController renvoie 404 lorsque l'ID contient une période

J'ai un ApiController et je souhaite utiliser les adresses électroniques comme paramètre d'ID pour les demandes:

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

Cependant, je ne peux pas obtenir que cela fonctionne (renvoie 404):

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

Les suivants fonctionnent tous:

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

J'ai mis relaxedUrlToFileSystemMapping="true" dans mon web.config comme détaillé par Phil Haack .

J'aimerais beaucoup que l'adresse e-mail complète me permette de travailler, mais chaque fois que la période est suivie par un autre caractère, la demande renvoie 404. Toute aide serait grandement appréciée!

Solution

Faute d’autres options, je me suis dirigée dans la direction suggérée par Maggie et a utilisé la réponse de cette question pour créer une règle de réécriture afin d’ajouter automatiquement une barre oblique de fin lorsque j’ai besoin d’un courrier électronique dans l’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>
51

Est-ce que l'ajout d'une barre oblique de fin fonctionnerait pour votre scénario?

http://localhost:33021/api/employees/[email protected]/
73
Maggie Ying

Vérifiez vos paramètres IIS:

Home Directory -> Configuration

Modifiez l'extension d'application .aspx et assurez-vous que le paramètre Verify that file exists est désactivé.

METTRE &AGRAVE; JOUR

Je viens de tester avec un projet d'API Web MVC4 par défaut

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

Action dans ValuesController:

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

C'était la réponse:

<string xmlns="http://schemas.Microsoft.com/2003/10/Serialization/">[email protected]</string>
2
Mightymuke

C'est ce qui a fonctionné pour moi:

Je courais sur targetFramework = 4.6.1. J'ai mis à jour à la version 4.6.2 et ajouté ceci dans 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>

Le requestPathInvalidCharacters="" doit pouvoir avoir des choses comme & etc dans l'URI, sous forme codée, bien sûr.

1
Nightrain