Использование WebClient в службе WCF - PullRequest
6 голосов
/ 07 июня 2011

Я использую WebClient для загрузки какого-либо ресурса следующим образом:

 Stream stream;
 try
 {
  WebClient webClient = new webClient();
  stream = webClient.OpenRead(MyResourceUri);
 }
 catch (Exception)
 {
  return null;
 }
 return stream;

Когда я делаю это в приложении WPF, он работает нормально и получается правильный поток.

Когда ясделать это в вызове службы WCF, это не работает.WebException генерируется с сообщением "Unable to connect to remote server".(Он работает для файлов, размещенных на моем компьютере или в сети компании, однако не работает для любого ресурса в сети).Служба размещена на IIS7.

Расследование до сих пор выявляет разницу из-за веб-прокси.Файл webclient.proxy в приложении WPF ссылается на настройки прокси-сервера, установленные в IE, тогда как в WCF его нет.

Почему это так?И что еще более важно, как я могу заставить WebClient в WCF использовать аналогичные настройки прокси?

РЕДАКТИРОВАТЬ: я установил прокси на WebClient, и он работал в службе WCF

webClient.Proxy = new WebProxy(ProxyAddressFromIE);

Здесь я жестко закодировалпрокси-адресКакой метод / API есть, чтобы получить один?И все же, почему он отличается в службе WCF и в приложении WPF?

Ответы [ 3 ]

2 голосов
/ 27 июня 2011

Мне нужно было сделать то же самое, и я нашел ответ здесь: Получить URI из веб-прокси по умолчанию . По сути, вам нужно динамически читать прокси с помощью WebRequest.GetSystemWebProxy() и путем определения прокси с помощью тестового прокси-адреса.

Надеюсь, это поможет!

2 голосов
/ 20 июля 2012

Чтобы ответить на один из ваших вопросов, причина различий между вашим приложением WPF и размещенной в IIS службой WCF заключается в следующем.

Приложения WPF выполняются в реальном сеансе Windows (точнее, в вашем сеансе пользователя). Это означает, что для этого сеанса загружен профиль пользователя, и этот сеанс содержит, помимо прочего, параметры прокси-сервера, настроенные в IE.

Службы WCF, размещенные в IIS, не работают в сеансе Windows. Они запускаются как служба и поэтому не имеют сеанса Windows (на самом деле они запускаются в сеансе 0, но это просто деталь реализации). Это означает, что нет конфигурации прокси.

Чтобы надежно решить эту проблему, у вас может быть собственная конфигурация для прокси, возможно, в web.config. Другой вариант - настроить прокси через netsh.exe.

0 голосов
/ 08 июня 2011

Рассмотрите возможность обработки вызова с использованием источников, отличных от сильно абстрагированного WebClient.От более высокого к более низкому уровню это означает изучение объектов WebRequest и WebResponse вплоть до программирования вне сокета.Причина в том, что метод WebClient тесно связан с выбором в Internet Explorer, так как большая часть интернет-стека высокого уровня находится в окнах.Если вы хотите обойти это, вам нужно копать глубже.

Я бы с удовольствием указал пальцем, где именно копать, но я не сталкивался с этой конкретной проблемой и не имею опыта решения.Я знаю, где искать ответ, но нет никаких подробностей о «X отмечает место».Однако из-за высокого уровня, высоко абстрагированной природы WebClient, я не уверен, что вы можете легко обойти неявное создание стека и / или соединение с IE, без большей головной боли, чем создание и использование объекта, который дает более явныйуправление HTTP-связью.

Удачной охоты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...