C#FTP下载文件出现远程服务器返回错误: (500) 语法错误,无法识别命令

简介: 如果下载多个文件的时候,有时候莫名其妙的出现500服务器错误,很有可能是没有设置KeepAlive 属性导致的。 出现应用程序未处理的异常:2015/1/6 11:40:56 异常类型:WebException 异常消息:远程服务器返回错误: (500) 语法错误,无法识别命令。

如果下载多个文件的时候,有时候莫名其妙的出现500服务器错误,很有可能是没有设置KeepAlive 属性导致的。

出现应用程序未处理的异常:2015/1/6 11:40:56
异常类型:WebException
异常消息:远程服务器返回错误: (500) 语法错误,无法识别命令。

参考:http://www.cnblogs.com/webabcd/archive/2007/01/21/626242.html

 KeepAlive - 指定连接是应该关闭还是在请求完成之后关闭,默认为true

 /// <summary>
        /// FTP下载文件(带进度条)
        /// </summary>
        /// <param name="filename"></param>
        public void DownloadFile(string filename)
        {
            float percent = 0;
            string filePathName = string.Empty;
            string url = string.Empty;
            filePathName = Path.Combine(Application.StartupPath, filename);
            string dirPath = GetDirPath(filePathName);
            if (!Directory.Exists(dirPath))
                Directory.CreateDirectory(dirPath);
            //=>替换文件目录中的路径为网络路径
            filename = filename.Replace("\\", "/");
            url = "ftp://" + clientUpdateInfo.UpdateFTPIP + "/" + clientUpdateInfo.UpdatePath + "/" + filename;
            var reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
            reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
            reqFtp.UseBinary = true;
            reqFtp.KeepAlive = false;//一定要设置此属性,否则一次性下载多个文件的时候,会出现异常。
            reqFtp.Credentials = new NetworkCredential(clientUpdateInfo.FtpUserName, clientUpdateInfo.FtpUserPwd);
            var response = (FtpWebResponse)reqFtp.GetResponse();
            long totalBytes = response.ContentLength;
            if (prog != null)
            {
                this.BeginInvoke(new MethodInvoker(delegate()
                {
                    prog.Maximum = (int)totalBytes;
                }));
            }
            Stream st = response.GetResponseStream();
            var so = new FileStream(filePathName, FileMode.Create);
            long totalDownloadedByte = 0;
            byte[] by = new byte[1024];
            int osize = st.Read(by, 0, (int)by.Length);
            while (osize > 0)
            {
                totalDownloadedByte = osize + totalDownloadedByte;
                so.Write(by, 0, osize);
                if (prog != null)
                {
                    this.BeginInvoke(new MethodInvoker(delegate()
                    {
                        prog.Value = (int)totalDownloadedByte;
                    }));

                }
                osize = st.Read(by, 0, (int)by.Length);
                percent = (float)totalDownloadedByte * 1.0f / (float)totalBytes * 100;
                Application.DoEvents();
                this.BeginInvoke(new MethodInvoker(delegate()
                {
                    lbDownInfo.Text = "正在下载" + filename + ",下载进度为:" + Math.Round(percent, 2) + "%";
                    lbDownInfo.Refresh();
                }));
                Application.DoEvents();
            }
            so.Close();
            st.Close();
            response.Close();
        }

        private void FtpDownload(string filename)
        {
            string filePathName = string.Empty;
            string url = string.Empty;
            filePathName = Path.Combine(Application.StartupPath, filename);
            string dirPath = GetDirPath(filePathName);
            if (!Directory.Exists(dirPath))
                Directory.CreateDirectory(dirPath);
            //=>替换文件目录中的路径为网络路径
            filename = filename.Replace("\\", "/");
            url = "ftp://" + clientUpdateInfo.UpdateFTPIP + "/" + clientUpdateInfo.UpdatePath + "/" + filename;
            FtpWebRequest reqFTP;
            this.BeginInvoke(new MethodInvoker(delegate()
            {
                this.lbDownInfo.Text = "开始下载中...";
            }));
            FileStream outputStream = new FileStream(filePathName, FileMode.Create);
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
            reqFTP.Credentials = new NetworkCredential(clientUpdateInfo.FtpUserName, clientUpdateInfo.FtpUserPwd);
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            reqFTP.UseBinary = true;
            reqFTP.KeepAlive = false;

            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            Stream ftpStream = response.GetResponseStream();
            int bufferSize = 1024;
            int readCount;
            byte[] buffer = new byte[bufferSize];
            readCount = ftpStream.Read(buffer, 0, bufferSize);
            //FTP上文件的大小
            int allbye = GetFtpFileSize(filename);// (int)response.ContentLength;
            int startbye = 0;
            this.BeginInvoke(new MethodInvoker(delegate()
              {
                  this.prog.Maximum = allbye;
                  this.prog.Minimum = 0;
                  this.prog.Visible = true;
                  this.lbDownInfo.Visible = true;
              }));
            while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
                startbye += readCount;
                this.BeginInvoke(new MethodInvoker(delegate()
                  {
                      this.lbDownInfo.Text = "已下载:" + (int)(startbye / 1024) + "KB/" + "总长度:"
                                            + (int)(allbye / 1024) + "KB" + " " + " 文件名:" + filename;
                      prog.Value = startbye;
                      this.lbDownInfo.Refresh();
                  }));
                Application.DoEvents();
                Thread.Sleep(5);
            }
            this.BeginInvoke(new MethodInvoker(delegate()
            {
                this.prog.Visible = false;
                this.lbDownInfo.Text = "下载成功!";
            }));
            ftpStream.Close();
            outputStream.Close();
            response.Close();
        }

 

目录
相关文章
|
3月前
|
存储 UED Windows
Windows服务器上大量文件迁移方案
Windows服务器上大量文件迁移方案
155 1
|
4月前
|
存储 监控 固态存储
【vSAN分布式存储服务器数据恢复】VMware vSphere vSAN 分布式存储虚拟化平台VMDK文件1KB问题数据恢复案例
在一例vSAN分布式存储故障中,因替换故障闪存盘后磁盘组失效,一台采用RAID0策略且未使用置备的虚拟机VMDK文件受损,仅余1KB大小。经分析发现,该VMDK文件与内部虚拟对象关联失效导致。恢复方案包括定位虚拟对象及组件的具体物理位置,解析分配空间,并手动重组RAID0结构以恢复数据。此案例强调了深入理解vSAN分布式存储机制的重要性,以及定制化数据恢复方案的有效性。
96 5
|
2月前
|
监控 Linux Shell
|
2月前
|
网络安全 Windows
Jetson 学习笔记(十五):FTP协议传输文件
本文介绍了如何使用WinSCP软件通过FTP协议在Windows和Jetson设备之间传输文件,并分享了一些操作经验和技巧。
30 0
Jetson 学习笔记(十五):FTP协议传输文件
|
2月前
|
Python
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件
这篇博客文章是关于如何使用Flask框架上传特征值数据到服务器端,并将其保存为txt文件的教程。
31 0
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件
|
2月前
阿里云国际版购买了服务器后如何下载发票?
阿里云国际版购买了服务器后如何下载发票?
|
2月前
|
弹性计算 安全 Linux
阿里云国际版使用ping命令测试ECS云服务器不通的排查方法
阿里云国际版使用ping命令测试ECS云服务器不通的排查方法
|
2月前
|
分布式计算 监控 Hadoop
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
42 1
|
3月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
54 4
|
2月前
|
前端开发 Docker 容器
主机host服务器和Docker容器之间的文件互传方法汇总
Docker 成为前端工具,可实现跨设备兼容。本文介绍主机与 Docker 容器/镜像间文件传输的三种方法:1. 构建镜像时使用 `COPY` 或 `ADD` 指令;2. 启动容器时使用 `-v` 挂载卷;3. 运行时使用 `docker cp` 命令。每种方法适用于不同场景,如静态文件打包、开发时文件同步及临时文件传输。注意权限问题、容器停止后的文件传输及性能影响。
191 0
下一篇
无影云桌面