Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C从HTTP响应中获取图像#_C#_Javascript_Html_Http_Rest - Fatal编程技术网

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

C# 使用C从HTTP响应中获取图像#,c#,javascript,html,http,rest,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 H

我试图从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页面(而不是图像)(还有标准内容,但这是页面上唯一的脚本):


var escapedHash='';
var url='1〕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);
}否则{;
window.location.href=url+escapedHash;
} 

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

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

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

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

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

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


你的应用程序没有登录,这就是为什么你要重定向到登录页面。

原来问题的根源就是我的愚蠢。代码运行得非常好,我只是忘记了我在调试之前注释掉了OpenAuth身份验证函数

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


这个故事的寓意是:确保您对发送的每个请求都进行了身份验证。

为什么不检查js并在应用程序中执行其中的逻辑?我尝试将js中的URL手动复制到我的应用程序中,只是为了看看是否可行,但它仍然充当重定向,HTTP响应的内容仍然包含Javascript页面:我已经尝试了以上所有方法,但我永远无法找到以.JPG或.PNG(实际图像本身)结尾的链接。甚至Javascript指向的链接本身也是无扩展和重定向的。当我在那个图像上复制URL时,我得到了原始的Javascript重定向页面;我必须打开Javascript才能看到实际的URL——这是我所说的无扩展的东西。当我访问该无扩展页面时,复制图像URL会得到该无扩展URL,我的代码仍然无法使用该URL。因此,为了回答您的问题,我认为无法获取直接图像URL。我的应用程序使用OpenAuth进行身份验证,因此就服务器权限而言,一切都已正常。您可以假设我可以访问我提到的所有资源,用户必须登录并通过身份验证才能执行这些代码。@dramallama您可以发布您得到的重定向页面吗?Javascript就是重定向页面。您无法访问的映像(重定向的目标)是一个显示映像的无扩展URL,但它仍然与C#streams不兼容。该目标没有任何页面源-就我的浏览器而言,它只是一个图像,没有扩展名(服务器重定向或其他?)。@Dramallama获取原始图像源的HTML URL是什么?尝试过了,但重定向位置的响应本身就是一个无扩展重定向,并且仍然不是实际的.JPG或.PNG图像。我感觉自己像掉进了兔子洞里(您不必介意扩展名。mime类型对于浏览器中的显示很重要。您应该继续遵循您得到的任何内容,直到获得HTTP响应200。如果遇到401,您需要提供凭据。404未找到,即死路一条。我鼓励您阅读此处的状态码定义:PS:虽然通常我不介意扩展,但在这种情况下,我的C#stream仍然无法读取它,所以我自己打开HTTP响应来查看它到底包含了什么。结果它包含了上一个Javascript重定向页面(重定向到当前的无扩展页面).Circular loop,永远不会到达任何地方,任何地方都找不到实际的图像链接。:(很抱歉让您失望,但问题是SalesForce的身份验证机制。您需要阅读http身份验证(摘要或其他)你需要在这方面做更多的工作。基本上,身份验证包括在身份验证头或cookie中放入一些秘密。但是
<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>