Использование 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;               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-сервисам.

ссылка на оригинал статьи https://habrahabr.ru/post/279879/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *