2012-05-16 1 views
1

Я пытаюсь захватить изображение из ответа HTTP в C#, но вместо изображения это один из этих перенаправлений. Вот соответствующий код:Схват изображения из ответа HTTP с помощью C#

String url = "my image URL that's actually a redirect URL" 
Image img = null; 
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
{ 
    using (Stream str = response.GetResponseStream()) 
    { 
     img = Image.FromStream(str); 
    } 
} 

Однако он продолжает говорить мне, что я не могу найти ответ. Я сохранил поток ответов в байте [], а затем распечатал его, и, как выяснилось, поток ответов на самом деле относится к странице перенаправления, а не к самому изображению, и что браузер заботится о том, чтобы через Javascript.

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

Edit: Это страница Javascript, который загружается (вместо изображения) (есть также стандартные вещи, но это единственный скрипт на странице):

<script> 
var escapedHash = ''; 
var url = 'https://login.salesforce.com/?ec=302&startURL=%2Fcontent%2Fsession%3Furl%3Dhttps%253A%252F%252Fc.na9.content.force.com%252Fprofilephoto%252F005%252FF'; 
if (window.location.hash) { 
    escapedHash = '%23' + window.location.hash.slice(1); 
} 
if (window.location.replace){ 
window.location.replace(url + escapedHash); 
} else {; 
window.location.href = url + escapedHash; 
} 
</script> 
+0

Почему бы не проверить js и выполнить логику там, в вашем приложении? – LawfulHacker

+0

Я попытался вручную скопировать URL-адрес из JS в мое приложение, чтобы убедиться, что это сработает, но оно по-прежнему действует как перенаправление, а содержимое HTTP-ответа по-прежнему содержит страницу Javascript.: O – sichinumi

ответ

2

Некоторые сайты предпринимают шаги, чтобы люди не могли использовать свои размещенные изображения. В основном вы должны утверждать, что запрашивающий сайт (ссылка URL) находится в их домене.

Что произойдет, если вы используете ту же самую ссылку, которую использовал ваш браузер? Если вы щелкните правой кнопкой мыши по изображению, вы можете «Скопировать URL-адрес изображения» или просмотреть «Свойства»? Если да, что произойдет, если вы скопируете URL-адрес в новое окно браузера? Что произойдет, если вы используете URL-адрес из нового окна браузера (показывая изображение) в качестве URL-адреса, который вы пытаетесь загрузить?

По моему опыту перенаправления обрабатываются браузером и .NET-классами без проблем. Возможно, вам придется указать аргумент или установить свойство, чтобы автоматически следовать переадресации.

Возможно ли получить URL-адрес, который вы пытаетесь загрузить?

Обновление:
Где находится ваше настольное приложение? Сайт не разрешает мне прямой доступ к изображению, потому что я не вошел в систему. Это также будет проблемой для вашего приложения.

Ваше приложение не вошло в систему, поэтому вы получаете перенаправление на страницу входа в систему.

+0

Я пробовал все вышеперечисленное, и я никогда не смогу достичь ссылка, которая заканчивается на .JPG или .PNG (фактическое изображение). Даже ссылка, на которую указывает Javascript, является без расширения и перенаправлением сама по себе. Когда я копирую URL-адрес на этом изображении, я получаю исходную страницу перенаправления Javascript; Мне пришлось открыть Javascript, чтобы увидеть фактический URL-адрес, о котором я говорил. Когда я посещаю эту страницу без расширения, копирование URL-адреса изображения дает мне этот URL без продолжения, который по-прежнему не используется моим кодом. Поэтому, чтобы ответить на ваш вопрос, я не думаю, что можно получить прямой URL изображения. – sichinumi

+0

Мое приложение аутентифицируется с помощью OpenAuth, поэтому все уже в порядке с разрешениями на сервер. Вы можете предположить, что у меня есть доступ ко всем ресурсам, о которых я упоминал, пользователь должен быть зарегистрирован и аутентифицирован для выполнения любого из этого кода. – sichinumi

+0

@ TheDramaLlama Можете ли вы опубликовать страницу переадресации, которую вы получаете? – Trisped

0

Вы должны следовать перенаправление в первом запросе (идентифицированное по HTTP-статусу 301 и заголовок Transport в ответе). Затем вы можете использовать свой текущий подход для ответа из места перенаправления.

+0

Пробовал это, но ответ от места перенаправления - это перенаправление без перераспределения и по-прежнему не является фактическим .JPG или .PNG-изображением. Я чувствую, что я рушаю кроличью нору. :( – sichinumi

+0

Вы не должны возражать против расширения. Тип mime - это то, что имеет значение в отношении отображения в браузере. Вы должны продолжать следить за тем, что получите, пока не получите ответ HTTP 200. Если вы столкнулись с 401, вам необходимо предоставить 404 не найден, т. е. тупик. Я бы рекомендовал вам прочитать определения кода состояния, найденные здесь: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html PS: пока изображение – faester

+0

Обычно я бы не возражал против расширения, но в этом случае мой поток C# все еще не мог его прочитать, поэтому я сам открыл ответ HTTP, чтобы узнать, что именно он содержит. Оказывается, в нем содержится предыдущая страница перенаправления Javascript (которая перенаправляет на текущую страницу без расширения). Циркулярный цикл никогда не попадает нигде, никакой реальной ссылки на изображение не может быть найден нигде. :( – sichinumi

1

Оказывается, корень проблемы был только тем, что я был немым. Код работает отлично, я просто забыл, что ранее я прокомментировал функцию аутентификации OpenAuth для отладки.

Таким образом, проблема заключалась в том, что все эти запросы изображений отправлялись без заголовка OAuth, что заставляло сервер возвращать страницу «Вход» вместо изображения (что, очевидно, не могло быть прочитано в C# Image).

Мораль истории: убедитесь, что вы аутентифицировали каждый запрос, который вы отправляете.

+0

Собираетесь ли вы принять мой ответ?Это было правильно, прежде чем мы начали общаться в чате. _Update: Где находится ваше настольное приложение? Сайт не разрешает мне прямой доступ к изображению, потому что я не вошел в систему. Это также будет проблемой для вашего приложения. »« – Trisped

+0

Ах, вы действительно правы - это был катализатор, который заставило меня понять, что я забыл не-аутентифицировать. Принято. :) – sichinumi

Смежные вопросы