[Из песочницы] Использование ClickOnce и прокси-сервера

сегодня в 14:56

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

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


   />


Но если компьютер настроен на использование прокси-сервера, требующего проверки подлинности, при попытке обновления мы получим следующую ошибку, даже если укажем свои 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);
        }

        /// 
        /// Альтернативный метод, который устанавливает Credentials
        /// 
        /// Учетные данные для аутентификации
        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

карма

0,0

рейтинг 4,0

© Habrahabr.ru