C#FTP下載文件出現遠程服務器返回錯誤: (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();
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM