![](/img/trans.png)
[英]System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
[英]Fixing - System.Net.WebException: The remote server returned an error: (500) Syntax error, command unrecognized
我創建了 FTP 代碼來傳輸文件。 此代碼工作正常,但有時會導致錯誤 500。確切的錯誤是 -
Error: System.Reflection.TargetInvocationException: Exception has
been thrown by the target of an invocation.
---> System.Net.WebException: The remote server returned an error:
(500) Syntax error, command unrecognized.
at System.Net.FtpWebRequest.CheckError()
at System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
at System.Net.CommandStream.Abort(Exception e)
at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
at System.Net.FtpWebRequest.GetRequestStream()
at ST_772dn22cj49ndfddatee.csproj.ScriptMain.Main()
--- End of inner exception stack trace ---
我注意到當加載最大的文件時會發生錯誤,即大約 290 KB。 所有其他文件都小於這個,我也不例外。 我不知道為什么會發生這種情況。 有人能告訴我為什么嗎?
順便說一句,如果您發現我的代碼或邏輯錯誤有一些改進空間,那么也請提及。 我並不是真的在尋找代碼審查,但它是受歡迎的。
public void Main()
{
Boolean conditions = true;
if(conditions == true)
{
string fileLocation = "my windows directory";
string fileName = "fileName.extension";
string ftpFolder = @"/ftpFolder/";
Boolean ftpMode = true; //passive or active. True = passive
string ftpPassword = "password";
int ftpPort = 21;// the default
string ftpServerName = "server name";
string ftpUserName = "user name";
//Create an object to communicate with the server.
string ftpRequestString = "ftp://" + ftpServerName + ":"
+ ftpPort + ftpFolder + fileName;
try{
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create(ftpRequestString);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
//Set mode
if(ftpMode == true){
request.UsePassive = true;
}
//Copy the file to the request.
string filePath = @fileLocation + "\\" + fileName;
StreamReader sourceStream = new StreamReader(filePath);
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
response.Close();
}
catch (WebException ex)
{
MessageBox.Show(ex.Message);
}//try-catch
}
}//main
在閱讀您的問題時,我懷疑這與(或可以通過)將KeepAlive
設置為false
。 看着 SO - 這個問題引用了同樣的問題並指向它: https : //stackoverflow.com/a/2071374/1803682
嘗試設置:
request.KeepAlive = false;
如果KeepAlive
設置為false
您的連接將在每個請求結束時關閉。 如果您正在傳輸大量文件,這可能是一個問題 - 因為重新發送憑據等需要時間。好處是您以已知/初始狀態重新創建連接,這應該可以解決您的問題(即使它不是根原因)。
要查看發生了什么,如果您可以在您的服務器上啟用詳細日志記錄,您應該看到在返回此錯誤之前發出的最后一條命令。 這應該讓您更好地了解發生了什么。 發現這個帖子說的差不多。
更新:
如果我閱讀了我自己發布的鏈接的底部,我可以回答得更好,重新發出的命令可能是登錄過程的一部分(即USER username
),這可能是您的問題:
憑據可能不再有效的原因是 WebRequest 使用了在一定時間后到期的租用。 如果您沒有顯式實例化租約並定義其超時,則 FtpWebRequest 似乎使用默認超時值。 我相信發生的事情是當租約到期時 FtpWebRequest 將嘗試再次登錄。
所以在這里尋找正確的搜索:
產生等待請求的默認超時不是指定的無限,而是實際上10000 ms
。 這似乎是一個相當大的差異。 所以你也可以嘗試設置:
request.Timeout = -1;
看看它是否糾正了你的錯誤。
真的不認為這可能是你的問題,所以把它移到底部:
另外 - 檢查您的
request.ReadWriteTimeout
是否適合您看到的較大文件的速度。
默認值是
5 分鍾,這對於 290k 來說已經很長了,所以我希望這不是您錯誤的根源。
另外 - 如果這是問題,我希望連接關閉錯誤。
我在自定義 MSBuild 任務中也遇到了與FTPWebRequest
相同的異常......幸運的是,該任務公開了一個設置UsePassive="false"
(它在FTPWebRequest
對象上設置UsePassive
屬性)。 將值更改為"true"
解決了問題。 希望這可以幫助!
UsePassive
to) false
如果客戶端應用程序的數據傳輸進程監聽數據端口上的連接; 否則,如果客戶端應在數據端口上發起連接,則為true
。 默認值為true.
UsePassive
屬性設置為true
會將"PASV"
命令發送到服務器。 此命令請求服務器偵聽數據端口並等待連接,而不是在收到傳輸命令后啟動連接。UsePassive
設置為 true,則 FTP 服務器可能不會發送文件的大小,並且下載進度可以始終為零。 如果UsePassive
設置為false
,防火牆可以發出警報並阻止文件下載。對於遇到此問題並且上述方法似乎不起作用的任何其他人,我發現當我遇到上述錯誤時,與我的用戶名或密碼有關。 我相信有很多人會從 Excel 復制並粘貼到 SQL 中,因此,SQL 發現我的用戶名/密碼有一個回車換行符(當您按下 Enter 鍵時)。
我的代碼實際上選擇了用戶名作為“Myusername & vbcrlf”。
希望這可以幫助某人,如果他們有同樣的問題。
干杯!
我從 FTP 服務器看到了相同的行為/響應,上述答案並沒有解決我的問題。 原來我的 FTP 服務器需要安全連接。 這是簡單的解決方法。 享受。
request.EnableSsl = true;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.