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, учетные данные сбрасываются на данные по умолчанию.
Решаем эту проблему следующим образом:
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