我正在尝试从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>
答案 0 :(得分:2)
有些网站会采取措施阻止人们使用托管图片。基本上,您必须声明请求站点(引用URL)位于其域中。
如果您使用浏览器使用的相同链接会怎样?如果右键单击图像,可以“复制图像URL”或查看“属性”吗?如果是这样,如果将URL复制到新的浏览器窗口会发生什么?如果您使用新浏览器窗口中的URL(显示图像)作为您尝试下载的URL,会发生什么?
根据我的经验,重定向由浏览器和.NET类处理,没有问题。您可能必须指定参数或设置属性以自动遵循重定向。
是否可以获取您尝试下载的网址?
<强>更新强>:
您的桌面应用程序在哪里登录?该网站不允许我直接访问该图像,因为我没有登录。这对您的应用程序也是一个问题。
您的应用未登录,这就是您重定向到登录页面的原因。
答案 1 :(得分:1)
原来问题的根源只是我愚蠢。代码工作得非常好,我只是忘了我之前已经注释掉了OpenAuth认证函数来进行调试。
所以问题是所有这些图像请求都是在没有OAuth标头的情况下发送的,这导致服务器返回“登录”页面而不是图像(显然无法将其读入C#图像)
故事的道德:确保验证您发送的每个请求。
答案 2 :(得分:0)
您必须遵循第一个请求中的重定向(由HTTP状态301和响应中的标头传输标识)。然后,您可以使用当前方法对重定向位置的响应进行处理。