How to add Headers in HTTPContext Response in ASP.

2019-01-25 08:18发布

问题:

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?

回答1:

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



回答2:

Try using

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


回答3:

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.



回答4:

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.



回答5:

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