简体   繁体   中英

Grabbing an image from an HTTP response with C#

I'm trying to grab an image from an HTTP response in C#, but instead of an image, it's one of those redirects. Here's the relevant code:

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);
    }
}

However, it keeps telling me that I can't seek through response. I saved the response stream in a byte[] and then printed it out, and it turns out the response stream is actually of the redirect page, not of the image itself, and that the browser is taking care that via Javascript.

How should I go about catching this image if it's never actually transmitted as a response to my initial request? I don't know how to monitor my browser's subsequent requests, and even if I point the stream at the image URL that it redirects to, it still gives me the same problems and prints out the same redirect page HTML.

Edit: This is the Javascript page that's being loaded (instead of the image) (there's also the standard stuff, but this is the only script on the page):

<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>

Some sites take steps to prevent people from using their hosted images. Basically you have to claim that the requesting site (referring URL) is on their domain.

What happens if you use the same link your browser used? If you right click on the image can you "Copy Image URL" or view the "Properties"? If so, what happens if you copy the URL into a new browser window? What happens if you use the URL from the new browser window (showing the image) as the URL you are trying to download?

In my experience redirects are handled by the browser and by the .NET classes without issue. You might have to specify an argument or set a property to automatically follow redirects though.

Is it possible to get the URL you are trying to download?

Update :
Where does your desktop app log in? The site does not allow me direct access to the image because I am not logged in. This would be a problem for your application too.

Your app is not logged in, which is why you are getting the redirect to the log in page.

Turns out the root of the problem was just me being dumb. The code works perfectly fine, I just forgot that I had commented out the OpenAuth authentication function earlier to debug.

So the problem was that all of these image requests were being sent with no OAuth header, which caused the server to return a "Log In" page instead of the image (which obviously couldn't be read into a C# Image).

Moral of the story: Make sure you authenticate every request you send.

You will have to follow the redirect in the first request (identified by HTTP status 301 and the header Transport in the response). You can then use your current approach on the response from the redirect location.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM