(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();

        }
    }
}

Надеюсь, поможет;-)

Другие вопросы по тегам