使用C#从HTTP响应中抓取图像

时间:2012-05-16 17:20:44

标签: c# javascript html http rest

我正在尝试从C#中的HTTP响应中获取图像,但它不是图像,而是其中一个重定向。这是相关的代码:

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

然而,它一直告诉我,我不能通过回应寻求。我将响应流保存在byte []中,然后将其打印出来,结果发现响应流实际上是重定向页面,而不是图像本身,并且浏览器正在通过Javascript来处理。

如果这张图片作为对我的初始请求的回复从未真正传输过,我该如何捕获?我不知道如何监控我的浏览器的后续请求,即使我将流指向它重定向到的图像URL,它仍然会给我同样的问题,并打印出相同的重定向页面HTML。

编辑:这是正在加载的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>

3 个答案:

答案 0 :(得分:2)

有些网站会采取措施阻止人们使用托管图片。基本上,您必须声明请求站点(引用URL)位于其域中。

如果您使用浏览器使用的相同链接会怎样?如果右键单击图像,可以“复制图像URL”或查看“属性”吗?如果是这样,如果将URL复制到新的浏览器窗口会发生什么?如果您使用新浏览器窗口中的URL(显示图像)作为您尝试下载的URL,会发生什么?

根据我的经验,重定向由浏览器和.NET类处理,没有问题。您可能必须指定参数或设置属性以自动遵循重定向。

是否可以获取您尝试下载的网址?

<强>更新
您的桌面应用程序在哪里登录?该网站不允许我直接访问该图像,因为我没有登录。这对您的应用程序也是一个问题。

您的应用未登录,这就是您重定向到登录页面的原因。

答案 1 :(得分:1)

原来问题的根源只是我愚蠢。代码工作得非常好,我只是忘了我之前已经注释掉了OpenAuth认证函数来进行调试。

所以问题是所有这些图像请求都是在没有OAuth标头的情况下发送的,这导致服务器返回“登录”页面而不是图像(显然无法将其读入C#图像)

故事的道德:确保验证您发送的每个请求。

答案 2 :(得分:0)

您必须遵循第一个请求中的重定向(由HTTP状态301和响应中的标头传输标识)。然后,您可以使用当前方法对重定向位置的响应进行处理。