(407) Требуется проверка подлинности прокси
Я знаю, что об этом спрашивали много, много раз. Я прочитал почти все сообщения здесь и на других сайтах, подобных этому.
http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/2931d21c-9ca8-4256-b213-915fad4c941b/
Безрезультатно. Вот среда
Windows Server 2008 R2 64-разрядная Visual Studio 2008 .NET Framework 3.5
Вот что я пробовал
У меня был прокси аутентификация с использованием кода
WebRequest req = WebRequest.Create(requestUri + data);
req.Proxy = new System.Net.WebProxy(<ProxyURL>:<port>",true);
req.Proxy.Credentials = CredentialCache.DefaultCredentials;
WebResponse resp = req.GetResponse();
Это сработало, но, увидев, как оно замедляет работу приложения, я узнал, что могу редактировать файл machine.config, что я и сделал. Это тоже сработало!
<system.net>
<defaultProxy
useDefaultCredentials="true">
<proxy
proxyaddress="<proxyURL>:<port>"
bypassonlocal="True"/>
</defaultProxy>
</system.net>
По крайней мере, на день или 2. Затем он начал выходить из строя.
Я тогда отредактировал это к этому
<system.net>
<defaultProxy
useDefaultCredentials="true">
<proxy usesystemdefault="True"/>
</defaultProxy>
</system.net>
Насколько я понимаю, это будет использовать настройки IE для подключения к прокси, но все равно не работает. Я тоже пробовал код
WebProxy proxy = new WebProxy(<proxy>:<port>);
CredentialCache myCache = new CredentialCache();
myCache.Add(new Uri(requestUri + data), "BASIC", new NetworkCredential(<username>,<password>));
proxy.Credentials = myCache;
request.Proxy = proxy;
request.Method = "GET";
И это не сработало.
Примечание: я могу скопировать файл machine.config на мой компьютер (Win XP) и запустить оттуда EXE-файл (без кода прокси), и он отлично работает.
Есть ли что-то другое, что мне нужно сделать с 64-битной ОС? Также я могу открыть IE8 на сервере и получить доступ к URI просто отлично. цель состоит в том, чтобы предварительно подтвердить подлинность прокси-сервера без необходимости ввода пароля пользователя в коде.
2 ответа
HttpWebRequest в любом случае использует прокси-сервер настроек Интернета по умолчанию (IE), поэтому, если он работает нормально с Internet Explorer на сервере, он также будет в порядке с вашим кодом (при условии, что он работает под той же учетной записью пользователя).
Я бы поставил machine.config обратно, как это было.
Одна вещь, которую я бы проверил, была бы в IIS, это то, что вы можете настроить провайдеров для апплета аутентификации Windows. Это должно перечислить NTLM и Kerberos в качестве поставщиков в списке; Я бы поменял их и посмотрел, имеет ли это значение (например, если NTLM находится в начале списка, переместите Kerberos в начало). Извините, я не могу дать вам точные инструкции, поскольку у меня нет IIS на этой машине.
Если вы все еще испытываете трудности, я бы порекомендовал вам запустить Fiddler на сервере, чтобы получить поток запросов и ответов для получения дополнительных подсказок.
@ Дэвид Мур прав. если IE работает нормально при просмотре вручную, просто добавьте req.Proxy.Credentials = CredentialCache.DefaultCredentials;
и это будет работать нормально.
Вот модифицированный код, взятый из MSDN, который работает для меня.
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
string urlDemo = "http://en.wikipedia.org/wiki/Main_Page";
// Create a request for the URL.
WebRequest request = WebRequest.Create(urlDemo);
// If required by the server, set the proxy credentials.
request.Proxy.Credentials = CredentialCache.DefaultCredentials;
// Get the response.
WebResponse response = request.GetResponse();
// Display the status.
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
// Get the stream containing content returned by the server.
Stream dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
// Display the content.
Console.WriteLine(responseFromServer);
Console.ReadLine();
// Clean up the streams and the response.
reader.Close();
response.Close();
}
}
}
Надеюсь, поможет;-)