簡體   English   中英

修復 - System.Net.WebException:遠程服務器返回錯誤:(500) 語法錯誤,命令無法識別

[英]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"解決了問題。 希望這可以幫助!

  • (Set 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM