1

我正在尝试从 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>
4

3 回答 3

2

一些网站会采取措施阻止人们使用他们托管的图像。基本上,您必须声明请求站点(引用 URL)在他们的域中。

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

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

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

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

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

于 2012-05-16T17:49:54.447 回答
1

原来问题的根源只是我愚蠢。代码工作得很好,我只是忘记了我之前已经注释掉了 OpenAuth 身份验证功能以进行调试。

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

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

于 2012-05-16T19:09:53.273 回答
0

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

于 2012-05-16T17:46:09.797 回答