none
大文件并发下载时iis停止响应 RRS feed

  • 问题

  • 请教:asp.net做了一个断点下载的的页面,主要代码为
                        byte[] buffer = new byte[StaticConfig.BufferSize];

                        while (length > 0 && this.Response.IsClientConnected)
                        {
                            //buffer = new byte[StaticConfig.BufferSize];
                            count = fs.Read(buffer, 0, StaticConfig.BufferSize);
                            this.Response.OutputStream.Write(buffer, 0, count);
                            this.Response.Flush();
                         }
    因为下载的文件都是大文件,所以传输需要几十分钟,但一般运行几分钟后,在访问就没有响应或者响应很慢,在下载没有断开,包括访问该网站的其他页面(简单asp页面)都没有响应或者响应很慢,但在该服务器上还能正常下载,其他的机器要不不能访问,要不访问很慢,感觉像自我保护一样,但是回收应用程序池或者重启IIS就都恢复了,郁闷中...

    同时在线下载的才有二十多个。 中间有些限速和状态管理的代码,注释了效果一样,就没有贴出来了。因为后面的请求根本没有到page_load方法

    日志显示,在卡死后,任然会有正常的访问,隔几分钟就有三四个访问被允许,而且访问时间是相同的,其实中间还有很多请求没有响应。

    在卡死一段时间后,运行到后面netstat -an 显示大量“CLOSE_WAIT”。

    各位大侠,请指教,也可以告诉我大概的问题在哪里,谢谢。

                       
    2012年4月9日 15:28

答案

  • 在加入

                        Context.ApplicationInstance.CompleteRequest();

                        this.Response.Close();

    代码后,问题基本解决,谢谢围观!

    2012年4月13日 2:46

全部回复

  • 补充一下,web.config已经加入 <httpRuntime executionTimeout="36000" />

    “CLOSE_WAIT” 主要出现在一台高负载的服务器上。

    有些服务器在负载比较小的时候反应慢点,但还能下载。

    2012年4月9日 15:40
  • 继续补充,当响应变慢后,下载那里会卡住,但等一会儿还可以下载,越到后面等得越久,像排队似得。

    现在主要是不知道该如何调试,因为卡住后根本不会执行到代码的位置。

    为何本机又可以下载而不用等待呢???

    变慢后回收应用程序池会卡住一分钟左右,然后就恢复了,这里也是一个很重要的问题????

    2012年4月9日 16:08
  • 应该与系统的网络没有关系,因为可以直接telnet到http 的端口,静态文件可以打开。
    2012年4月9日 16:10
  • 问题仍然没有解决,时间越久,就没有任何响应了,而且CPU使用很高,

    所有其他的代码都已经基本删除了,下面是主要代码  环境 win 2k3 iis6.0  .net 2.0

                       this.Response.Cache.SetCacheability(HttpCacheability.Public);
                        this.Response.Cache.SetLastModified(DateTime.Now);
                        this.Response.AppendHeader("Content-Length", length.ToString());

     using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))

    {

                            if (pos > 0)
                            {
                                this.Response.StatusCode = 206;
                                fs.Position = pos;
                            }
                            this.Response.AppendHeader("Accept-Ranges", "bytes");
                            this.Response.ContentType = "application/octet-stream";
                            this.Response.AppendHeader("Connection", "Keep-Alive");
                            this.Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}", HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8)));

         byte[] buffer = new byte[StaticConfig.BufferSize];

                        while (length > 0 && this.Response.IsClientConnected)
                        {
                            
                            count = fs.Read(buffer, 0, StaticConfig.BufferSize);
                            this.Response.OutputStream.Write(buffer, 0, count);
                            this.Response.Flush();

    //buffer = new byte[StaticConfig.BufferSize];
                         }

    }

    this.Response.Close();

    buffer = new byte[StaticConfig.BufferSize];注释掉内存图形如下,不注释则是平的,而且w3wp.exe使用100左右

    2012年4月11日 16:50
  • 继续找原因,基本找到了问题,但还是没有找到解决方法。

    发布开始一段时间后,iis和客户端的连接不能正常断开,导致大量的连接保持,超时时间远远超过iis6默认的120s,最后系统基本没有响应,但本机却能访问就是这个原因。

    现在在所有的catch后面都加入了Response.Close();

    但还是在运行一段时间后大量的客户端连接着,因为文件是流媒体,这里是用来做伪流发布的,客户端是flash的播放器。

    如果有朋友知道该怎么处理的话,麻烦email: hldsoft@hotmail.com,谢谢。


    2012年4月12日 9:23
  • 在加入

                        Context.ApplicationInstance.CompleteRequest();

                        this.Response.Close();

    代码后,问题基本解决,谢谢围观!

    2012年4月13日 2:46