Запрос обрабатывается нормально, когда выдается браузером, но не когда приложение ASP.NET на том же компьютере
Я отлаживаю два приложения ASP.NET, работающие на одной машине под разными экземплярами Cassini и с отключенными "пользовательскими ошибками". Одно приложение работает на порту 100 и хочет выполнить GET
запрос от другого приложения, работающего на порту 90. Таким образом, он выполняет этот код:
WebRequest request = WebRequest.Create(
"http://localhost:90/Controller/Action?Param1=foo&Param2=bar");
request.Timeout = 10000;
request.GetResponse();
и последняя строка бросает WebException
с HTTP 400
Код и ноль InnerException. Если я скопирую тот же URL-адрес в буфер обмена, вставьте его в IE, работающий на том же компьютере, - запрос помещается в очередь приложения на порт 90 и его /Controller/Action/
вызывается и даже параметры передаются в порядке.
Что может быть причиной возникновения проблемы здесь и как ее решить?
3 ответа
Отладка в течение двух часов - и оказалось, что служба на порту 90 перенаправит запрос обратно на службу на порту 100, но не предоставит требуемый параметр в URL, поэтому обработчик службы на порту 100 сгенерирует исключение и вернуть HTTP 400, который затем был сообщен GetResponse()
, Решением было изменить логику так, чтобы не было перенаправления для этого конкретного запроса, потому что перенаправление не имело бы смысла для этого конкретного запроса.
И жюри признает, что и Cassini, и ASP.NET не виновны.
Я попытался бы использовать перегрузку WebRequest.Create, которая принимает объект URI, таким образом, вы можете исключить жирный URL.
Я думаю, что вы должны попробовать без параметров в URL.
WebRequest request = WebRequest.Create("localhost:90/Controller/Action");
request.Timeout = 10000;
request.GetResponse();
если это работает, вам нужно добавить несколько заголовков пользовательских агентов, чтобы разрешить использование параметров.
Также вам стоит взглянуть на WebClient. MSDN
лично я бы также посмотрел на использование IISExpress или IIS для разработки такого решения.
Просто постороннее наблюдение здесь, рассмотрите возможность сделать этот вызов второму веб-методу с помощью вызова ajax из браузера и агрегировать результаты на стороне клиента, используя javascript (jQuery).