1

Let me say:

Click the first link pop up the save as box,then click cancel。Next,

Click the second link pop up the save as box,then click cancel。Next,

Click the third link pop up the save as box,then click cancel。

At the moment,The pop up box do not show and the page same as busying!

The condition just in win7 . In XP no problem.

Sorry for my bad english! Index.aspx:

<a href="ShowFile.aspx?fileID=1" >download</a>
<a href="ShowFile.aspx?fileID=2" >download</a>
<a href="ShowFile.aspx?fileID=3">download</a>
<a href="ShowFile.aspx?fileID=4" >download</a>

ShowFile.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
        {

            Page.Response.Clear();
            bool success = ResponseFile(Page.Request, Page.Response, "1.doc", @"d:\1.doc", 1024000);
            if (!success)
                Response.Write("dowload error!");
            Page.Response.End();
        }
        public static bool ResponseFile(HttpRequest _Request, HttpResponse _Response, string _fileName, string _fullPath, long _speed)
        {
            try
            {
                FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                BinaryReader br = new BinaryReader(myFile);
                try
                {
                    _Response.AddHeader("Accept-Ranges", "bytes");
                    _Response.Buffer = false;
                    long fileLength = myFile.Length;
                    long startBytes = 0;

                    double pack = 10240; //10K bytes
                    //int sleep = 200;   //
                    int sleep = (int)Math.Floor(1000 * pack / _speed) + 1;
                    if (_Request.Headers["Range"] != null)
                    {
                        _Response.StatusCode = 206;
                        string[] range = _Request.Headers["Range"].Split(new char[] { '=', '-' });
                        startBytes = Convert.ToInt64(range[1]);
                    }
                    _Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
                    if (startBytes != 0)
                    {
                        //Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
                    }
                    _Response.AddHeader("Connection", "Keep-Alive");
                    _Response.ContentType = "application/octet-stream";
                    _Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(_fileName, System.Text.Encoding.UTF8));

                    br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
                    int maxCount = (int)Math.Floor((fileLength - startBytes) / pack) + 1;

                    for (int i = 0; i < maxCount; i++)
                    {
                        if (_Response.IsClientConnected)
                        {
                            _Response.BinaryWrite(br.ReadBytes(int.Parse(pack.ToString())));
                            Thread.Sleep(sleep);
                        }
                        else
                        {
                            i = maxCount;
                        }
                    }
                }
                catch
                {
                    return false;
                }
                finally
                {
                    br.Close();

                    myFile.Close();
                }
            }
            catch
            {
                return false;
            }
            return true;
        }
Darin Dimitrov
  • 1,023,142
  • 271
  • 3,287
  • 2,928
user1662936
  • 41
  • 1
  • 1
  • 8

1 Answers1

1

Usually when you make a page for downloading a file you better use a handler, or at least if its aspx page disable the session.

The reason is because the session is lock the user until is finish, and when you download a file you usually take long time, or if you stop it can be stack until understand that the network is closed.

So disabling the session for this aspx page can solve your issue.

relative:
Web app blocked while processing another web app on sharing same session
What perfmon counters are useful for identifying ASP.NET bottlenecks?
Replacing ASP.Net's session entirely
Trying to make Web Method Asynchronous

Community
  • 1
  • 1
Aristos
  • 66,005
  • 16
  • 114
  • 150