標籤:
如果下載多個檔案的時候,有時候莫名其妙的出現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(); }
C#FTP下載檔案出現遠程伺服器返回錯誤: (500) 語法錯誤,無法識別命令