2016-08-12 2 views
0

Я пытаюсь получить доступ к защищенному URL-адресу через веб-клиент и получить несколько ошибок. Общая цель - загрузить изображение с защищенного url.Как получить доступ к защищенному URL-адресу с помощью webclient

Обратите внимание, что ранее я смог загрузить изображение из репозитория с помощью http, и теперь у них есть принудительный (security) https в том же URL-адресе. У нас есть консольное приложение, которое работает на периодической основе и вытаскивает изображение с сервера и сохраняет локально.

Просьба сообщить, что я делаю неправильно? или чего не хватает?

Ниже приведены вопросы, с которыми я столкнулся.

  1. ///, если я использую раздел кода 1 ... Я получаю сообщение об ошибке, поскольку параметр недействителен.
  2. /// если я использую раздел кода 2 ... Файл будет сохранен на местном, но получить сообщение "Файл, как представляется, поврежден или большой и не смогли открыть.

Раздел 1 и 2 приведены ниже.

  using (WebClient webClient = new WebClient()) 
      { 

       webClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 
       webClient.Credentials = new NetworkCredential("id", "pwd"); // if credentials are wrong...still I get the imageByte 

       /// section 1 - if I use this code... I get error saying Parameter is not valid. 
       // ----------------------------- Start -------------------------------- 
       imageByte = webClient.DownloadData("https://someurl/source/abcd.jpeg"); 
       ////Initialize image variable 
       Image newImage; 
       ////Read image data into a memory stream 
       using (MemoryStream ms = new MemoryStream(imageByte, 0, imageByte.Length, true)) 
       { 
        ms.Write(imageByte, 0, imageByte.Length); 

        //Set image variable value using memory stream. 
        newImage = Image.FromStream(ms, true, false); // Throws error at this line saying that parameter is not valid. 
       } 
       newImage.Save(@"location\image.jpeg"); 
       // ----------------------------- End -------------------------------- 


       /// section 2 - if I use this code... File gets saved to local but get a message " File appear to be corrupt or large and not able to open. 
       // ----------------------------- Start -------------------------------- 
       webClient.DownloadFile("https://someurl/source/abcd.jpeg", @"location\image.jpeg"); 
       // ----------------------------- End -------------------------------- 

      } 

ответ

0

Обе ошибки говорят о том, что данные, которые были загружены не является допустимым JPEG изображения. Вероятно, это происходит потому, что какая-то ошибка была возвращена с сервера.

для того, чтобы проверить, если сервер возвратил ошибку , вы можете взглянуть на то, что в HTTP-ответе heade rs и body.

  • Для тела вы можете просто попытаться открыть файл, сохраненный в разделе 2, с помощью текстового редактора.

  • Для заголовков вы можете проверить webClient.ResponseHeaders property с отладчиком или с простым обновлением вашей программы.

Пример ниже взят из MSDN:

// Obtain the WebHeaderCollection instance containing the header name/value pair from the response. 
WebHeaderCollection myWebHeaderCollection = myWebClient.ResponseHeaders; 

Console.WriteLine("\nDisplaying the response headers\n"); 

// Loop through the ResponseHeaders and display the header name/value pairs. 
for (int i=0; i < myWebHeaderCollection.Count; i++) 
{  
    Console.WriteLine ("\t" + myWebHeaderCollection.GetKey(i) + " = " + myWebHeaderCollection.Get(i)); 
} 

другие способы, чтобы видеть то, что было на самом деле вернулся с сервера Invoke-WebRequest PowerShell cmdlet или wget utility (оба должны поддерживать HTTPS и аутентификации)

+0

Спасибо за ввод. Я попытался получить информацию из заголовка ответа и не увидел никакой ошибки как таковой. Я получил меньше ответа.Pragma = no-cache Cache-Control = no-cache, no-store Expires = Thu, 07, 2016 00:00:00 GMT Set-Cookie = JSESSIONID = "некоторое значение GUID"; Path =/ABCD /; Закрепить; HttpOnly Сервер = Apache Content-Type = текст/html; кодировка = UTF-8 Content-Language = EN-US Transfer-Encoding = Chunked Варах = Accept-Encoding Дата = Пт, 12,2016 То, что я мог видеть, истекает, устанавливается на вчерашнюю дату ... Может быть, это проблема? – Amit

+0

То, что выглядит подозрительно, это Content-Type = text/html - я ожидаю, что это будет изображение/jpeg. Вы пытались открыть сохраненный файл с помощью текстового редактора (тело ответа должно быть в тексте UTF-8)? – Kel

+0

вы правы .. когда я открываю файл в текстовом редакторе ... он работал как шарм ... и вот почему я не смог открыть файл в любом редакторе изображений ... поэтому виновником здесь является Content- Type = text/html ... любая идея, как мы можем получить тип как изображение? – Amit

0

You» re код работает нормально. Как предположил Кел, вероятнее всего, ответ сервера ответа сервера может дать ответ. Вы уверены, что сервер настроен на поддержку https?

Нет необходимости указывать сетевые учетные данные. Поскольку HTTPS является только транспортным протоколом. Он обеспечивает только соединение.

Для аутентификации вам необходимо настроить сервер, например, для аутентификации BASIC или DIGEST. И если требуется авторизация настройки для запрошенного ресурса.

Один комментарий к вашему коду: не забывайте утилизировать newImage.