Запрос обрабатывается нормально, когда выдается браузером, но не когда приложение 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).

Другие вопросы по тегам