web-dev-qa-db-fra.com

La méthode WebApi avec le paramètre d'adresse électronique renvoie 404 à partir de HttpClient

J'ai un contrôleur WebApi avec une méthode qui ressemble à ceci:

[HttpGet]
[AcceptVerbs("GET")]
public HttpResponseMessage Run(string reportName, int someId, string someText, DateTime asOfDate, string username)

J'ai un itinéraire personnalisé configuré spécifiquement pour cette action. Lorsque je navigue dans le navigateur sur le service Web, tout fonctionne correctement et l'action appropriée est exécutée:

http://localhost:xxxx/ControllerName/Run/asdf/1/asdf/07-01-2012/[email protected]

Cependant, lorsque j'essaie d'appeler le service Web par programmation à l'aide de HttpClient et en exécutant un "Get", une erreur 404 s'affiche. Je ne reçois pas d'erreur lorsque le paramètre nom d'utilisateur n'est pas une adresse électronique. Par exemple, lorsque le nom d'utilisateur est simplement "utilisateur", tout fonctionne correctement. Voici l exemple de code:

var url = "http://localhost:xxxx/ControllerName/Run/asdf/1/asdf/07-01-2012/[email protected]"
var client = new System.Net.Http.HttpClient();
var response = client.Get(url);

//fails here with 404 error
response.EnsureSuccessStatusCode();

J'ai essayé UrlEncoder l'adresse e-mail sans succès. Tout conseil est apprécié.

25
Matt Wolin

Juste une petite pensée ... le ".com" pourrait-il être à l'origine du problème?

30
Ryan Ferretti

En effet, IIS tente de mapper des caractères spéciaux. L'ajout des éléments suivants au fichier web.config devrait résoudre le problème:

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

Plus d'informations ici: http://www.iis.net/configreference/system.webserver/modules

17
DataPispor

Vous avez besoin d'une requête URL de base.

[Route("api/emails")]
public HttpResponseMessage Run(string email) {...}

GET api/[email protected]
0

L'ajout des éléments suivants au fichier web.config ne devrait pas résoudre le problème complet:

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

La solution ne fonctionne plus car un segment de chemin supplémentaire est utilisé dans l'URI pour moi. https://localhost:xxxx/[email protected] fonctionne

https://localhost:xxxx/path/[email protected] ne fonctionne pas

J'ai cherché sur Google et j'ai compris qu'il s'agissait d'une extension. (.cs donne une erreur différente en .com) et trouve finalement ceci: Route ASP.net MVC4 WebApi avec nom de fichier

Ma solution consistait à ajouter ou à modifier le gestionnaire suivant dans la section <handlers> de votre <system.webServer>:

<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" 
           path="*.*" 
           verb="*" 
           type="System.Web.Handlers.TransferRequestHandler" 
           preCondition="integratedMode,runtimeVersionv4.0" />

ou changez le chemin en path=*@*.*

0
Roberto B