Bruno Machado - vargero
Bruno Machado - vargero

Reputation: 2730

How to add Headers in HTTPContext Response in ASP.NET MVC 3?

I have a download link in my page, to a file I generate by the user request. Now I want to display the file size, so the browser can display how much is left to download. As a solution, I guess addin a Header to the request would work, but now I don't know how to do it.

Here is my try code:

public FileStreamResult DownloadSignalRecord(long id, long powerPlantID, long generatingUnitID)
{
    SignalRepository sr = new SignalRepository();
    var file = sr.GetRecordFile(powerPlantID, generatingUnitID, id);
    Stream stream = new MemoryStream(file);

    HttpContext.Response.AddHeader("Content-Length", file.Length.ToString());

    return File(stream, "binary/RFX", sr.GetRecordName(powerPlantID, generatingUnitID, id) + ".rfx");
}

When I checked on fiddler, it didn't display the Content-Length header. Can you guys help me out?

Upvotes: 20

Views: 104029

Answers (5)

winy101
winy101

Reputation: 504

Try using

HttpContext.Response.Headers.Add("Content-Length", file.Length.ToString());

Upvotes: 25

Mikael Östberg
Mikael Östberg

Reputation: 17166

This should solve it as I think there's no need to use the FileStreamResult, when you can use the byte[] directly.

public FileContentResult DownloadSignalRecord(long id, long powerPlantID, long generatingUnitID)
{
    SignalRepository sr = new SignalRepository();
    var file = sr.GetRecordFile(powerPlantID, generatingUnitID, id);

    HttpContext.Response.AddHeader("Content-Length", file.Length.ToString());

    return File(file, "binary/RFX", sr.GetRecordName(powerPlantID, generatingUnitID, id) + ".rfx");
}

Note the FileContentResult return type.

Upvotes: 1

Mikael Östberg
Mikael Östberg

Reputation: 17166

Can you please try the following code and see if that works?

public FileStreamResult Index()
{
    HttpContext.Response.AddHeader("test", "val");
    var file = System.IO.File.Open(Server.MapPath("~/Web.config"), FileMode.Open);
    HttpContext.Response.AddHeader("Content-Length", file.Length.ToString());
    return File(file, "text", "Web.config");
}

"It works on my machine"

And I've tried without the Content-length header and Fiddler reports a content length header anyway. I don't think it's needed.

Upvotes: 4

heisenberg
heisenberg

Reputation: 9759

Not sure what else may be wrong there, but that content-length should be the size of the binary, not the string length.

Upvotes: 0

Mrchief
Mrchief

Reputation: 76258

Try HttpContext.Current.Response.AppendHeader("Content-Length", contentLength);

Upvotes: 18

Related Questions