Закрытие соединения при даунлоде больших фалов
От: danee  
Дата: 28.07.05 20:34
Оценка:
При даунлоде браузером больших файлов через httphandler очень часто происходит обрыв соединения по Timer_ConnectionIdle

Файл на даунлод отдает следующий метод


protected void PushCollection(string displayname, string filename)
{

    int blockSize = 65536;
    System.IO.FileStream fs = null;

    HttpResponse Response = Context.Response;
    displayname = Context.Server.UrlPathEncode(displayname);
    Response.BufferOutput = false;
    Response.Cache.SetNoServerCaching();
    Response.Clear();
    Response.ContentType = "application/x-compressed";
    Response.AppendHeader("Accept-Ranges", "bytes");
    Response.AppendHeader("content-disposition", string.Format("attachment; filename={0}", displayname));
    try
    {
        fs = new FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
    }
    catch
    {
        Utils.LogDebug("Error: Unable to open file for reading");
    }
    if (fs != null)
    {
        long dataToRead = fs.Length;
        string tmpTag = string.Format("{0}:{1}", displayname, fs.Length);
        IsRanged(tmpTag); // просто проверка на наличие ETag и его разборка
        Response.AppendHeader("ETag", tmpTag);
        if (isRanged)
        {
            if (rangeEnd <= 0 || rangeEnd >= dataToRead)
            {
                rangeEnd = dataToRead - 1;
                if (rangeStart < 0)
                {
                    rangeStart = 0;
                }
            }
            dataToRead = rangeEnd - rangeStart + 1;
            Response.AppendHeader("Content-Range", string.Format("{0}-{1}/{2}", rangeStart,                         rangeEnd, fs.Length));
            fs.Position = rangeStart;
            Response.StatusCode = 206;
        }
        if (dataToRead < int.MaxValue) // Internal Parsing of content-length header to Int32 :)
        {
            Response.AppendHeader("content-length", dataToRead.ToString());
        }
        Response.Flush();
        TimeSpan ts = DateTime.Now - methodStartTime;
        if (dataToRead < blockSize)
        {
            blockSize = (int)dataToRead;
        }
        byte[] buffer = new byte[blockSize];
        while (dataToRead > 0)
        {
            try
            {
                if (Response.IsClientConnected)
                {
                    int dataRead = fs.Read(buffer, 0, blockSize);
                    Response.OutputStream.Write(buffer, 0, dataRead);
                    Response.Flush();
                    dataToRead = dataToRead - dataRead;
                    if (dataToRead < blockSize)
                    {
                        blockSize = (int)dataToRead;
                    }
                }
                else
                {
                    dataToRead = -1;
                    buffer = null;
                            Utils.LogDebug("Error: User disconnected");
                }
            }
            catch
            {
                Utils.LogDebug("Error: Unable to read from file");
            }
        }
        if (fs != null)
        {
            fs.Close();
        }
    }
}


У кого-нибудь есть идеи как с этим бороться?
Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.