2013-08-06 12 views
21

Mam kontroler WebAPI z metodą, która wygląda jak takie:metoda WebAPI z parametrem adres email zwraca 404 z HttpClient

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

Mam trasą niestandardową skonfigurowany specjalnie dla tego działania. Kiedy nawigacja przeglądarkę do usługi internetowej, wszystko działa bez zarzutu, a odpowiednie działania jest wykonywany:

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

Jednak gdy próbuję programowo wywołać usługę internetową przy użyciu HttpClient i wykonanie „Get” otrzymuję błąd 404. Nie pojawia się błąd, gdy parametr username nie jest adresem e-mail. Na przykład, gdy nazwa użytkownika jest po prostu "użytkownikiem", wszystko działa poprawnie. Oto przykładowy kod:

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(); 

Próbowałem adresu UrlEncoding adres e-mail bez powodzenia. Każda rada jest doceniana.

+0

Spróbuj zastąpić @ przez% 40 -Edit- Po prostu kompletne losowe domysły. -Edit2- UrlEncoding powinien był włączyć go dla ciebie, więc jeśli to, co powiedziałem, że działa, możesz sprawdzić, w jaki sposób użyłeś UrlEncoding i możliwe parametry. – Pluc

+2

Biorąc pod uwagę złożoność twojego żądania, możesz użyć czasownika 'POST' i zamiast tego wysłać niestandardowy obiekt złożony. Pomija się także inne problemy, takie jak niemożność przekazania znaku '/' w żadnym z łańcuchów. – user1908061

+0

@Pluc, Podałem twoją sugestię strzałem bez powodzenia zgodnie z oczekiwaniami, ponieważ jest to dokładnie to, co robił. Dzięki, tho. –

Odpowiedz

23

Po prostu szybka myśl ... czy ".com" może być przyczyną problemu?

+18

Wow, thanks! To było właściwie "." charakter powodujący problemy, a nie symbol "@". Po obejrzeniu tego posta: http://stackoverflow.com/questions/13298542/apicontroller-returns-404-when-id-contains-period Właśnie dodałem końcowe "/" w trasie do ostatniego parametru i To działa jak urok. –

15

Dzieje się tak, ponieważ usługi IIS próbują odwzorować znaki specjalne. Dodanie następujących do pliku web.config powinno rozwiązać problem:

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

Więcej informacji tutaj: http://www.iis.net/configreference/system.webserver/modules

+0

To jest poprawka, o której myślę, że pójdziemy, chociaż chciałbym zobaczyć, czy są jakieś inne problemy, które mogą z tego wyniknąć. – Codeacula

+0

@Codeacula przy najgorszej wydajności, ponieważ zarządzane moduły będą używane do wyświetlania statycznej zawartości. Będzie to dobrze, jeśli treść wymaga dowolnego rodzaju autoryzacji. – user2320464

0

Musisz podstawowe zapytania URL.

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

GET api/[email protected] 
Powiązane problemy