При даунлоде браузером больших файлов через 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();
}
}
}
У кого-нибудь есть идеи как с этим бороться?
Спасибо