I’m working on a web service using ASP.NET MVC’s new WebAPI that will serve up binary files, mostly .cab and .exe files.
The following controller method seems to work, meaning that it returns a file, but it’s setting the content type to application/json:
public HttpResponseMessage<Stream> Post(string version, string environment, string filetype)
{
var path = @"C:\Temp\test.exe";
var stream = new FileStream(path, FileMode.Open);
return new HttpResponseMessage<Stream>(stream, new MediaTypeHeaderValue("application/octet-stream"));
}
Is there a better way to do this?
Try using a simple
HttpResponseMessagewith itsContentproperty set to aStreamContent:A few things to note about the
streamused:You must not call
stream.Dispose(), since Web API still needs to be able to access it when it processes the controller method’sresultto send data back to the client. Therefore, do not use ausing (var stream = …)block. Web API will dispose the stream for you.Make sure that the stream has its current position set to 0 (i.e. the beginning of the stream’s data). In the above example, this is a given since you’ve only just opened the file. However, in other scenarios (such as when you first write some binary data to a
MemoryStream), make sure tostream.Seek(0, SeekOrigin.Begin);or setstream.Position = 0;With file streams, explicitly specifying
FileAccess.Readpermission can help prevent access rights issues on web servers; IIS application pool accounts are often given only read / list / execute access rights to the wwwroot.