使用 C# 从 HTTP 响应中获取图像
本文关键字:获取 图像 响应 HTTP 使用 | 更新日期: 2023-09-27 18:34:27
我试图从 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);
}
}
然而,它一直告诉我,我无法通过回应来寻求。我将响应流保存在一个字节[]中,然后将其打印出来,结果发现响应流实际上是重定向页面的,而不是图像本身的,并且浏览器正在通过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>
某些网站会采取措施阻止人们使用其托管图像。 基本上,您必须声称请求站点(引用URL(位于其域中。
如果您使用浏览器使用的相同链接会怎样? 如果您右键单击图像,您可以"复制图像URL"或查看"属性"吗? 如果是这样,如果将 URL 复制到新的浏览器窗口中会发生什么情况? 如果您使用新浏览器窗口中的 URL(显示图像(作为您尝试下载的 URL,会发生什么情况?
根据我的经验,重定向由浏览器和 .NET 类处理,没有问题。 不过,您可能必须指定参数或设置属性以自动遵循重定向。
是否可以获取您尝试下载的 URL?
更新:
您的桌面应用程序在哪里登录? 该网站不允许我直接访问图像,因为我没有登录。 这对您的应用程序来说也是一个问题。
您的应用程序未登录,这就是您重定向到登录页面的原因。
事实证明,问题的根源只是我愚蠢。代码运行良好,我只是忘记了我之前已经注释掉了 OpenAuth 身份验证函数以进行调试。
所以问题是所有这些图像请求都是在没有OAuth标头的情况下发送的,这导致服务器返回"登录"页面而不是图像(显然无法读入C#图像(。
故事的寓意:确保对您发送的每个请求进行身份验证。
您必须遵循第一个请求中的重定向(由响应中的 HTTP 状态 301 和标头 Transport 标识(。然后,您可以对来自重定向位置的响应使用当前方法。