Использование ClickOnce и прокси-сервера

в 11:56, , рубрики: .net, C#, ClickOnce, tutorial

ClickOnce — технология Майкрософт для развёртывания приложений. Приложения ClickOnce могут проверять наличие новых версий по мере их доступности и автоматически заменять любые обновленные файлы, что очень удобно.

Бывает так, что для управления доступом пользователей к Интернету и ресурсам внешней сети используется прокси-сервер (с аутентификацией или без). ClickOnce предоставляет поддержку встроенной проверки подлинности прокси-сервера в Windows, начиная с версии .NET Framework 3.5, но не поддерживает другие протоколы проверки подлинности, такие как «Обычная проверка подлинности» или «Краткая проверка подлинности».

Если не используется проверка подлинности, мы можем настроить прокси с помощью элемента defaultProxy:

<defaultProxy
  enabled="true|false"
  useDefaultCredentials="true|false"
  <bypasslist> … </bypasslist>
  <proxy> … </proxy>
  <module> … </module> />

Но если компьютер настроен на использование прокси-сервера, требующего проверки подлинности, при попытке обновления мы получим следующую ошибку, даже если укажем свои Credentials:

Удаленный сервер возвратил ошибку: (407) требуется проверка подлинности прокси.

Это происходит потому, что каждый раз, когда загружается файл с помощью класса SystemNetDownloader, учетные данные сбрасываются на данные по умолчанию.

Решаем эту проблему следующим образом:

Создаем свой класс прокси: CustomUserProxy

 public class CustomUserProxy : IWebProxy
    {
        private WebProxy _webProxy;     

        private CustomUserProxy(Uri uri)
        {
            _webProxy = new WebProxy(uri);
        }
       
        public ICredentials Credentials
        {
            get { return _webProxy.Credentials; }
            set { }
        }

        public Uri GetProxy(Uri destination)
        {
            return _webProxy.GetProxy(destination);
        }

        public bool IsBypassed(Uri host)
        {
            return _webProxy.IsBypassed(host);
        }

        /// <summary>
        /// Альтернативный метод, который устанавливает Credentials
        /// </summary>
        /// <param name="credentials">Учетные данные для аутентификации</param>
        private void SetCredentials(ICredentials credentials)
        {
            _webProxy.Credentials = credentials;
        }

Используем свой прокси:

Uri uriProxy = new Uri("http://myproxy.ent:808");
CustomUserProxy customProxy = new CustomUserProxy(uriProxy);
customProxy.SetCredentials(new NetworkCredential("Login", "Password"));
WebRequest.DefaultWebProxy = customProxy;

Работает в проекте, который использует обновления ClickOnce и обращения к WCF-сервисам.

Автор: Alertt

Источник

Поделиться новостью

* - обязательные к заполнению поля