Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.Net C# : Read attachment from HttpWebResponse

Is it possible to read an image attachment from System.Net.HttpWebResponse?

I have a url to a java page, which generates images.

When I open the url in firefox, the download dialog appears. Content-type is application/png.
Seems to work.

When I try this in c#, and make a GET request I retrieve the content-type: text/html and no content-disposition header.

Simple Code:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

response.GetResponseStream() is empty.

A try with java was successful.

Do I have to prepare webrequest or something else?

like image 897
user311164 Avatar asked Apr 07 '10 16:04

user311164


2 Answers

You probably need to set a User-Agent header.

Run Fiddler and compare the requests.

like image 85
SLaks Avatar answered Nov 12 '22 19:11

SLaks


Writing something in the UserAgent property of the HttpWebRequest does indeed make a difference in a lot of cases. A common practice for web services seem to be to ignore requests with an empty UserAgent. See: Webmasters: Interpretation of empty User-agent

Simply set the UserAgent property to a non-empty string. You can for example use the name of your application, assembly information, impersonate a common UserAgent, or something else identifying.

Examples:

request.UserAgent = "my example program v1";
request.UserAgent = $"{System.Reflection.Assembly.GetExecutingAssembly().GetName().Name.ToString()} v{System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()}";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36";

And just to give a full working example:

using System.IO;
using System.Net;

void DownloadFile(Uri uri, string filename)
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
    request.Timeout = 10000;
    request.Method = "GET";
    request.UserAgent = "my example program v1";
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        using (Stream receiveStream = response.GetResponseStream())
        {
            using (FileStream fileStream = File.Create(filename))
            {
                receiveStream.CopyTo(fileStream);
            }
        }
    }
}
like image 42
Deantwo Avatar answered Nov 12 '22 17:11

Deantwo