【问题标题】:Grabbing an image from an HTTP response with C#使用 C# 从 HTTP 响应中获取图像
【发布时间】:2012-05-16 17:20:43
【问题描述】:

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

【问题讨论】:

  • 为什么不检查 js 并在你的应用程序中执行逻辑?
  • 我尝试手动将 JS 中的 URL 复制到我的应用程序中,只是为了看看这是否可行,但它仍然充当重定向,并且 HTTP 响应的内容仍然包含 Javascript 页面。 :O

标签: c# javascript html http rest


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我已经尝试了以上所有方法,但我无法访问以 .JPG 或 .PNG(实际图像本身)结尾的链接。甚至 Javascript 指向的链接本身也是无扩展的并且是重定向的。当我在该图像上复制 URL 时,我得到了原始的 Javascript 重定向页面;我必须打开 Javascript 才能看到实际的 URL——我说的是没有扩展名的东西。当我访问该无扩展名页面时,复制图像 URL 会为我提供该无扩展名 URL,但我的代码仍然无法使用该 URL。因此,要回答您的问题,我认为不可能获得直接的图片网址。
  • 我的应用程序使用 OpenAuth 进行身份验证,因此就服务器权限而言,一切都已经正常。您可以假设我可以访问我提到的所有资源,用户必须登录并通过身份验证才能执行任何此代码。
  • @TheDramaLlama 你能发布你得到的重定向页面吗?
  • 那个 Javascript 是重定向页面。您无法访问的图像(重定向的目标)是显示图像但仍与 C# 流不兼容的无扩展 URL。该目标没有任何页面源 - 就我的浏览器而言,它只是一个图像,只是没有扩展名(服务器重定向或其他东西?)。
  • @TheDramaLlama 获取原始图像源的 HTML 的 URL 是什么?
【解决方案2】:

原来问题的根源只是我很笨。代码运行的很好,只是忘记了之前调试的OpenAuth认证函数注释掉了。

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

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

【讨论】:

  • 你会接受我的回答吗?在我们开始聊天之前是正确的“更新:您的桌面应用程序在哪里登录?该站点不允许我直接访问图像,因为我没有登录。这对您的应用程序也是一个问题。"
  • 啊,你确实是对的 - 这是让我意识到我忘记取消身份验证的催化剂。公认。 :)
【解决方案3】:

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

【讨论】:

  • 试过了,但是来自重定向位置的响应本身就是一个无扩展重定向,并且仍然不是实际的 .JPG 或 .PNG 图像。我觉得我正在从一个兔子洞里翻滚。 :(
  • 你不应该介意扩展。 mime 类型与浏览器中的显示有关。在收到 HTTP 响应 200 之前,您应该继续执行任何操作。如果遇到 401,您需要提供凭据。 404未找到,即死胡同。我鼓励您阅读此处的状态代码定义:w3.org/Protocols/rfc2616/rfc2616-sec10.html PS: while image
  • 通常我不会介意扩展,但在这种情况下,我的 C# 流仍然无法读取它,所以我自己打开了 HTTP 响应以查看它到底包含什么。原来它包含以前的 Javascript 重定向页面(重定向到当前的无扩展页面)。循环循环,永远无法到达任何地方,在任何地方都找不到实际的图像链接。 :(
  • 很抱歉让您失望,但问题是销售队伍的身份验证机制。您需要阅读 http 身份验证(摘要或其他),并且需要在这方面做更多的工作。基本上,身份验证涉及在身份验证标头或 cookie 中放置一些秘密。但是获取这些信息可能很困难。您应该询问有关针对 Salesforce 的身份验证或更一般性的问题。但总的来说,您最好进一步熟悉 http 协议。
  • 我不明白你的意思 - 我的客户已经通过 OpenAuth 进行了身份验证,并且可以访问网站上的所有其他数据。我遇到的唯一问题是弄清楚如何成功序列化头像图像 - 我访问任何其他数据都没有问题。我目前已经在所有 HTTP 请求的标头中包含了 OpenAuth 访问令牌 - 我还缺少另一种身份验证方法吗? (编辑:更正,我是个白痴。我之前注释掉了我的身份验证调用以进行调试并忘记取消注释。我一直在发送所有这些没有 OAuth 标头的图像下载。)
猜你喜欢
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 2016-03-26
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多