C # не может сохранить файл из URL с прокси - PullRequest
1 голос
/ 07 октября 2011

Я пытаюсь скачать файл с URL.Я пробую два подхода, но он не работает с внешними файлами.

Я думаю, что это происходит, потому что у меня есть Интернет через прокси.Я могу загружать файлы внутренней сети (изображения, mp3, mp4 и т. Д.), Но когда я пытаюсь загрузить что-то во внешнюю сеть, это дает мне таймаут или 404 не найдено .

1-й подход: System.Net.WebResponse, System.IO.FileStream

     try
        {
            var credentials = new NetworkCredential("myNetworkUserName", "myNetworkPassword", "myNetworkDomain");
            var proxy = WebProxy.GetDefaultProxy(); //new WebProxy("myNetworkProxy") <-- I TRY BOOTH WAYS
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://farm1.static.flickr.com/83/263570357_e1b9792c7a.jpg"); //External image link

            proxy.Credentials = credentials;

            request.Proxy = proxy;

            responseExternalImage = request.GetResponse();//explode here ex=""Unable to connect to the remote server""

            string fileName = GetFileName(response.ResponseUri.OriginalString);
                Stream stream = response.GetResponseStream();

                using (BinaryReader br = new BinaryReader(stream))
                {
                    content = br.ReadBytes(50000000);//perto de 50Mb
                    br.Close();
                }
                response.Close();

                FileStream fs = new FileStream(pathToSaveFile + "\\" + fileName, FileMode.Create);
                BinaryWriter bw = new BinaryWriter(fs);
                try
                {
                    bw.Write(content);
                }
                finally
                {
                    fs.Close();
                    bw.Close();
                }
        }
        catch (Exception ex)
        {

        }

Исключение, зафиксированное в GetResponse () говорит: «Невозможно подключиться к удаленному серверу», «« Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, потому что подключенный хост не смог ответить 77.238.160.184:80 ""


2-й подход: System.Net.WebClient, DownloadFile

      try
        {
            var credentials = new NetworkCredential("xpta264", ConfigurationManager.AppSettings["Xpta264Password"], "ptsi");
            var proxy = WebProxy.GetDefaultProxy();
            proxy.Credentials = credentials;

            // Create a new WebClient instance.
            using (WebClient myWebClient = new WebClient())
            {
                myWebClient.Proxy = proxy;
                // Download the Web resource and save it into the current filesystem folder.
                myWebClient.DownloadFile("http://farm1.static.flickr.com/83/263570357_e1b9792c7a.jpg", pathToSaveFile + "\\testImage.jpg");
            }
        }
        catch (Exception e)
        {

        }

Исключение было обнаружено при DownloadFile метод и выдает мне ту же ошибку.

Надеюсь, кто-нибудь может мне помочь.

Извините за мой английский

1 Ответ

0 голосов
/ 07 октября 2011

WebProxy.GetDefaultProxy() устарел и не обрабатывает все случаи. Из документов :

Примечание. Этот API устарел.

Метод GetDefaultProxy не выбирает динамические параметры, которые генерируются из сценариев, запускаемых Internet Explorer, из автоматического записи конфигурации или из поиска DHCP или DNS.

Приложения должны использовать свойство WebRequest.DefaultWebProxy и метод WebRequest.GetSystemWebProxy вместо GetDefaultProxy способ.

Лучший подход - попытаться запросить URL и посмотреть, использовался ли прокси. Я использую этот код в моей собственной производственной системе, и он, кажется, работает довольно хорошо. Как только вы найдете прокси, вы можете где-то кешировать адрес:

WebProxy proxy = null;

Uri testUri = new Uri("http://www.example.com/"); // replace with REAL url
Uri proxyEndpoint = WebRequest.GetSystemWebProxy().GetProxy(testUri);
if (!testUri.Equals(proxyEndpoint))
    proxy = new WebProxy(proxyEndPoint.ToString());

Вы также можете просто попробовать позвонить по номеру WebRequest.GetSystemWebProxy() и посмотреть, даст ли это вам прокси, но я помню, что у меня были проблемы с этим, поэтому я пошел по маршруту запроса выше. YMMV.

...