我在项目中使用ftp操作上传这块,ftp站点和web站点发布在一个IIS上,上传几个文件后程序就会卡死,
两个站点分开放在不同的机器上问题就不会出现,不知道大家遇过这问题没?

解决方案 »

  1.   

    没有用过IIS的FTP,我下的是serv-u,管理的,蛮强大的
      

  2.   

    一般不用windows 自带。
    lz 的问题大概是FTP和IIS权限配置有点问题吧...
      

  3.   


    其次我用.net自带ftp类库操作的上传这块。
      

  4.   

    从LZ 分开放没有问题这点来看可能是用一个IIS的时候2个站点公用了一个应用程序池
    建议建立2个不同的应用程序池来对应不同的站点另外你的FTP站点应该考虑以下几个问题:
    1. FTP是否有超时问题?
    2. FTP是否允许上传大于4M的文件
      

  5.   


    win2003中,ftp站点没有使用应用程序池。 
      

  6.   


    win2003中,ftp站点没有使用应用程序池。 是我的理解有误,这里的FTP站点应该是指: IIS 的FTP服务在 FTP站点-> 链接超时这个地方尝试设置的大一点的值
      

  7.   


    另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。
      

  8.   


    另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。今早我查看了下会话状态,发现怎么会有25个用户,而且都是同一行用户,
    我的工作流是这样的, 一个分公司拥有一台文件服务器,也就是一个用户名, 那么在一个分公司下上传文件时会话应该保持一个啊,不应该出现25个,似乎看到这步卡死还是有道理的。到这一步怎么优化呢?
      

  9.   


    另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。通过跟踪我发现文件上传了25个就卡死了,此时正好会话连接次数也到了25个,问题似乎找到了端倪,但是为什么分开搭建就可以呢。上传代码:   if (baseFile == null)
                {
                    throw new ArgumentNullException("文件句柄不能为空");
                }            Stream requestStream = null;
                Stream fileStream = null;
                //获取文件长度  
                int FileLength = baseFile.ContentLength;
                //限制上传文件最大不能超过500M  
                if (FileLength < 500 * 1024 * 1024)
                {
                    try
                    {
                        if (!GetFileList())
                        {
                            FtpCheckDirectoryExist(ftpFilePath);
                        }
                        //格式化为URI  
                        Uri uri = new Uri(ftpUrl + ftpFilePath + filename);
                        ftpRequest = (FtpWebRequest)WebRequest.Create(uri);//创建FtpWebRequest实例uploadRequest  
                        ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;//将FtpWebRequest属性设置为上传文件 
                        ftpRequest.UseBinary = true;
                        ftpRequest.KeepAlive = false; //上传完一次则销毁服务器的连接.
                        ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPwd);//认证FTP用户名密码  
                        int bufferlen = 2048;
                        byte[] buffer = new byte[bufferlen];
                        //获得用于上传FTP的流    
                        requestStream = ftpRequest.GetRequestStream();
                        fileStream = baseFile.InputStream; //截取FileUpload1获取的文件流,作为上传FTP的流  
                        int len = fileStream.Read(buffer, 0, bufferlen);
                        while (len > 0)
                        {
                            requestStream.Write(buffer, 0, bufferlen);
                            len = fileStream.Read(buffer, 0, bufferlen);
                        }                    requestStream.Close();
                        requestStream.Dispose();
                        fileStream.Close();
                        fileStream.Dispose();
                        //ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();//返回FTP服务器响应,上传完成  
                        }
                  
                    catch (Exception ex)
                    {                }
                   
                }
                else
                {
                    //上传文件过大   
                }
      

  10.   


    1. 关于为什么会有25个用户....从LZ贴的代码上看不到有明显问题,唯一可以改进的是 try...catch...final ,把释放链接放到FINAL中,然后建议把 CATCH exception 的内容记录下来。2. 不过一到25个就卡死说明你服务器FTP的端口 允许的最大链接被限制了,有几个地方可以设置最大链接数 一个是 IIS本身,还有就是路由器防火墙中(通常在跨网段应用中会遇到这个问题)。
      

  11.   


    1. 关于为什么会有25个用户....从LZ贴的代码上看不到有明显问题,唯一可以改进的是 try...catch...final ,把释放链接放到FINAL中,然后建议把 CATCH exception 的内容记录下来。2. 不过一到25个就卡死说明你服务器FTP的端口 允许的最大链接被限制了,有几个地方可以设置最大链接数 一个是 IIS本身,还有就是路由器防火墙中(通常在跨网段应用中会遇到这个问题)。1、我在调用的地方已经加了using,他会释放闲置资源,
    2、FTP站点连接我设置为1000, 25个我的意思是当文件上传到25个时系统便会卡死,这时去查看会话数量是25个,把web站点分开架设时其实会话连接也不会停的增长,但是不会卡死。
      

  12.   


    那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行  “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————
    假设以上判断正确:
    那解决方法有以下几个:
    1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。
    2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。
      

  13.   


    那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行  “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————
    假设以上判断正确:
    那解决方法有以下几个:
    1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。
    2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。
    FTP服务器的连接我设置的1000个。
      

  14.   


    那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行  “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————
    假设以上判断正确:
    那解决方法有以下几个:
    1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。
    2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。
    FTP服务器的连接我设置的1000个。限制链接数的地方不光是IIS 路由等设备亦可限制。
    你的环境是跨网段的还是同网段的?
      

  15.   


    那我估计问题应该是这样的:服务端的FTP链接数被限制为25个了,导致你客户端链接第26个线程时,一直在WAIT。所以出现了"卡死"验证这个判断的方法是: 在 客服端执行  “netstat -n” 看与服务器FTP 端口的 第26个链接是否一直是 TIME_WAIT。如果是的话问题肯定就出在这个地方。————————————
    假设以上判断正确:
    那解决方法有以下几个:
    1. 查找 链接数被限制的原因,通常来自路由和防火墙之类的设备。
    2. 或者修改FTP客户端,确保一个客户端只有一个链接。(我估计你使用了多线程上传文件所以会出现一个客户端有N个会话。
    FTP服务器的连接我设置的1000个。限制链接数的地方不光是IIS 路由等设备亦可限制。
    你的环境是跨网段的还是同网段的?目前是在局域网内测试,web站点和ftp站点在同一台服务器上。
      

  16.   

    刚才我接着测试,在会话数量达到25个时,我把已有的连接全部手动断开,此时让文件继续上传,还是持卡死状态,可见问题可能不在这里,因为web站点和ftp站点分开是不存在问题的,会话连接自己闲置时就会自动关闭。
      

  17.   

    内网的话,肯定不存在连接数限制。
    这样的话,难道是FTP服务配置有问题? 有没有用其他FTP软件,测试一下 看服务器能否突破25线程限制?
      

  18.   


    另外,建议LZ具体抓一下 “卡死” 时的FTP 会话状态,可以到IIS FTP站点->当前会话里 看一下客户端状态。通过跟踪我发现文件上传了25个就卡死了,此时正好会话连接次数也到了25个,问题似乎找到了端倪,但是为什么分开搭建就可以呢。上传代码:   if (baseFile == null)
                {
                    throw new ArgumentNullException("文件句柄不能为空");
                }            Stream requestStream = null;
                Stream fileStream = null;
                //获取文件长度  
                int FileLength = baseFile.ContentLength;
                //限制上传文件最大不能超过500M  
                if (FileLength < 500 * 1024 * 1024)
                {
                    try
                    {
                        if (!GetFileList())
                        {
                            FtpCheckDirectoryExist(ftpFilePath);
                        }
                        //格式化为URI  
                        Uri uri = new Uri(ftpUrl + ftpFilePath + filename);
                        ftpRequest = (FtpWebRequest)WebRequest.Create(uri);//创建FtpWebRequest实例uploadRequest  
                        ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;//将FtpWebRequest属性设置为上传文件 
                        ftpRequest.UseBinary = true;
                        ftpRequest.KeepAlive = false; //上传完一次则销毁服务器的连接.
                        ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPwd);//认证FTP用户名密码  
                        int bufferlen = 2048;
                        byte[] buffer = new byte[bufferlen];
                        //获得用于上传FTP的流    
                        requestStream = ftpRequest.GetRequestStream();
                        fileStream = baseFile.InputStream; //截取FileUpload1获取的文件流,作为上传FTP的流  
                        int len = fileStream.Read(buffer, 0, bufferlen);
                        while (len > 0)
                        {
                            requestStream.Write(buffer, 0, bufferlen);
                            len = fileStream.Read(buffer, 0, bufferlen);
                        }                    requestStream.Close();
                        requestStream.Dispose();
                        fileStream.Close();
                        fileStream.Dispose();
                        //ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();//返回FTP服务器响应,上传完成  
                        }
                  
                    catch (Exception ex)
                    {                }
                   
                }
                else
                {
                    //上传文件过大   
                }
    你的代码有问题
    while (len > 0)
                        {
                            requestStream.Write(buffer, 0, bufferlen);
                            len = fileStream.Read(buffer, 0, bufferlen);
                        }
    其中一行要改成
     requestStream.Write(buffer, 0, buffer.Length);
      

  19.   

    写错了,是requestStream.Write(buffer, 0, len); 
      

  20.   

    服务器是什么版本?IIS和FTP用了共同的目录吗?
    你用其它方式上传文件试试,已排除代码的干扰。
      

  21.   


    win2003 IIS6.0 
    说起目录,都是放在d盘, 不同文件夹
      

  22.   

    先用其它ftp客户端上传文件试试,看有没有问题
    服务器是否补丁是否打全
    找到个问题和你类似的
    http://www.experts-exchange.com/Software/Server_Software/Web_Servers/Microsoft_IIS/Q_23290142.html
      

  23.   


    serv-u是付费的。FileZilla 
    有服务器版和客户端版两种
    全免费,配置简单,FTP功能足够用了。客户端也可用它的.