I have this code, that is working when only 1 download is running at a time
using (System.IO.FileStream fs = System.IO.File.OpenRead(@"C:\HugeFile.GBD"))
{
using (System.IO.BinaryReader br = new System.IO.BinaryReader(fs))
{
Response.AddHeader("Cache-control", "private");
Response.AddHeader("Content-Type", "application/octet-stream");
Response.AddHeader("Content-Length", fs.Length.ToString());
Response.AddHeader("Content-Disposition", "filename=HugeFile.GBD");
Response.Flush();
float kbs = 20f;
while (fs.Position < fs.Length)
{
if (!Response.IsClientConnected)
break;
byte[] bytes = br.ReadBytes((int)Math.Truncate(1024 * kbs));
char[] c = UTF8Encoding.Default.GetChars(bytes);
Response.Write(c, 0, c.Length);
Response.Flush();
System.Threading.Thread.Sleep(1000);
}
Response.Flush();
}
}
But if I make two simultaneous connections (start a second download on the same browser) the second one doesn’t execute until the first finishes.
Using a thread or a task results in an error when adding the Headers to the Response…
How can I make it so I can execute 2+ downloads on the same browser at the same time?
It seems that Google Chrome handles a download with a unique URL, so when I try to access the same URL it doesn’t even run the action.
By adding anything to the URL, ex:
Chrome will think it is a different download and get it. So, to download a file, even if a different generated file every time, we need to change the URL.
And as for the throttle I created a
FileThrottleResultwhich inherits fromFilePathResult:Usage:
This will successfully limit the bandwidth and will not have problems with simultaneous downloads of the same file, as long as you trick the browser with a “different” url.