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

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;     

        public 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>
        public 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-сервисам.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 4

    0
    Насколько я знаю такое решение помогает самому приложению (WCF подхватывает проксик), и возможно если приложение уже установлено.
    Если у вас чистая машина, то пробиться через проксик не получится, потому что стандартный dfsvc.exe это не умеет, а свой код на машину вы еще не закачали.

    Есть решение с тем чтобы перебить стандартный загрузчик ClickOnce. Но оно мне не нравится, поскольку убивает на корню всю прелесть ClickOnce установки, т.к. надо по сути патчить .NET.

    Причем, проблема довольно старая и до сих пор не поправлена, хотя фикс вроде не сложный совсем.
      0
      Кстати, ClickOnce и обновления то ставит довольно странно… буквально вчера обновлял два хоста с офисом, на одном окно с предупреждением об обновлении появилось как только вызвал проверку обвновлений из Word, второй хост просто молчал на такие действия. Запуск того же из Планировщика задач тоже не увенчался успехом. В процессах появляется OfficeClick2Run и тишина… может посоветует корректный способ запуска проверки и скачивания обновлений? /update в моем случае не помогает.
        +1
        Я замучился поддерживать ClickOnce в своих приложениях. Все сводится к тому, что как бы не была хороша система автоапдейтов, всегда встретится кто-то у кого ничего вообще не работает. А с ClickOnce очень много головной боли связанной с тем что приложение нужно подписывать и что если вдруг добавил или удалил DLLку — все, это уже другое приложение, и автоапдейт не работает вообще. Кто знает, может я просто "не умею его готовить", но я пересел на обычные MSI и пока как-то назад не очень хочется.
          0
          Поддерживаю, регулярно проблемы с установкой и обновлением приложения ClickOnce, в независимости от версий Windows у пользователей.
          Смотрю в сторону Squirrel.Windows, они позиционируют себя как ClickOnce, который работает(внутри используют NuGet)
          Кто то пользуется Squirrel? Есть какие то проблемы?

        Only users with full accounts can post comments. Log in, please.