it-roy-ru.com

Метод WebApi с параметром адреса электронной почты возвращает 404 из HttpClient

У меня есть контроллер WebApi с методом, который выглядит так:

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

У меня есть собственный маршрут, настроенный специально для этого действия. Когда я перемещаю свой браузер к веб-сервису, все работает нормально, и выполняется соответствующее действие:

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

Однако, когда я пытаюсь программно вызвать веб-сервис, используя HttpClient и выполняя «Get», я получаю ошибку 404. Я не получаю сообщение об ошибке, когда параметр username не является адресом электронной почты. Например, когда имя пользователя просто «пользователь», все работает нормально. Вот пример кода:

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

Я попытался UrlEncoding адрес электронной почты без удачи. Любой совет приветствуется.

25
Matt Wolin

Просто быстрая мысль ... может ли ".com" быть причиной проблемы?

30
Ryan Ferretti

Это потому, что IIS пытается отобразить специальные символы. Добавление следующего в web.config должно исправить проблему:

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

Более подробная информация здесь: http://www.iis.net/configreference/system.webserver/modules

17
DataPispor

Вам нужен базовый URL-запрос.

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

GET api/[email protected]
0
Sittipol Pungprakiet

Добавление следующего в файл web.config не должно полностью решить проблему:

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

Решение больше не работает, так как для меня в URI используется дополнительный сегмент пути .https://localhost:xxxx/[email protected] работает

https://localhost:xxxx/path/[email protected] не работает

Я гуглял вокруг и вокруг, и я понял, что это расширение. (.cs выдает другую ошибку, как .com) и, наконец, находит это: маршрут ASP.net MVC4 WebApi с именем файла в нем

Моим решением было добавить или изменить следующий обработчик в разделе <handlers> вашего <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" />

или измените путь на path=*@*.*

0
Roberto B