問題描述
我創建了 FTP 代碼來傳輸文件.此代碼工作正常,但有時會導致錯誤 500.確切的錯誤是 -
I created FTP code to transfer files. This code works fine except that it sometimes causes an error 500. The exact error is -
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)時會發生錯誤.所有其他文件都少于此,我對它們也不例外.我不知道為什么會這樣.誰能告訴我為什么?
I noticed that the error occurs when the biggest file is loaded, ie about 290 KB. All other files are less than this and i get no exception for them. I don't know why this happens. Can someone tell me why ?
順便說一句,如果您發現我的代碼有一些改進空間或邏輯錯誤,請同時提及.我并不是真的在尋找代碼審查,但它是受歡迎的.
As an aside, in case you notice some room for improvement in my code or logical error, then please mention that as well. I am not really looking for code reviews, but its welcome.
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
設置為 有關(或可以通過以下方式糾正)錯誤代碼>.看著 SO - 這個問題引用了同樣的問題并指出它:https://stackoverflow.com/a/2071374/1803682
On reading your question I was suspicious this has to do with (or could be corrected by) setting the KeepAlive
to false
. Looking on SO - this question references the same problem and points to it as well: https://stackoverflow.com/a/2071374/1803682
嘗試設置:
request.KeepAlive = false;
將 KeepAlive
設置為 false
您的連接將是 在每個請求結束時關閉.如果您要傳輸大量文件,這可能是一個問題 - 因為重新發送憑據等需要時間.好處是您以已知/初始狀態重新創建連接,這應該可以解決您的問題(即使它不是根原因).
With KeepAlive
set to false
your connection will be closed at the end of each request. If you are transmitting a lot of files this could be an issue - as it takes time to resend credentials, etc. The upside is you recreate the connection in a known / initial state which should solve your problem (even if it is not the root cause).
要查看發生了什么,如果您可以在服務器上啟用詳細日志記錄,您應該會在看到返回此錯誤之前看到發出的最后一條命令.這應該讓您更好地了解發生了什么.發現這個帖子說了很多同樣的話.
To see what is going on, if you can enable detailed logging on your server you should see the last command issued before seeing this error returned. This should give you a better idea of what is up. Found this thread saying much the same thing.
更新:
如果我閱讀了我自己發布的鏈接的底部,我可能會回答得更好,重新發出的命令可能是登錄過程的一部分(即 USER 用戶名
),這是您可能遇到的問題:
If I had read to the bottom of the link I posted myself I could have answered even better, the command probably being reissued is some part of the login process (i.e. USER username
) and this is your likely issue:
憑證可能不再有效的原因是WebRequest 使用在一定時間后到期的租約.如果您沒有明確實例化租約并定義其超時,FtpWebRequest 似乎使用默認超時值.我相信發生的事情是,當租約到期時,FtpWebRequest 將然后嘗試重新登錄.
The reason the creadentials may no longer be valid is that the WebRequest uses a lease that expires after a certain amount of time. If you don't explicitly instantiate the lease and define its timeouts, the FtpWebRequest appears to use default timeout values. I believe what's happening is that when the lease expires the FtpWebRequest will then try to log on again.
看起來 這里 使用正確的搜索:
So looking here with the right search:
導致等待請求的默認超時不是無限的,因為 指定,但實際上10000 ms
.這似乎是一個很大的差異.所以你也可以嘗試設置:
yields that the default timeout waiting for requests is not infinite as specified but actually 10000 ms
. Which seems a pretty big discrepancy. So you can also try setting:
request.Timeout = -1;
看看它是否能糾正你的錯誤.
And see if it corrects your error.
真的不認為這可能是您的問題,所以將其移至底部:
Really don't think this could be your issue so moving it to the bottom:
另外 - 檢查您的 request.ReadWriteTimeout
是否適合您看到的較大文件的速度.默認值為 5分鐘 這對于 290k 來說會很長,所以我希望這不是你的錯誤的根源.另外 - 如果這是問題,我預計會出現連接關閉錯誤.
Also - check that your request.ReadWriteTimeout
is appropriate for the speed you see for the larger file. The default is 5 minutes which would be pretty long for 290k, so I expect this is not the source of your error. Also - I would expect a connection closed error if this was the problem.
這篇關于修復 - System.Net.WebException:遠程服務器返回錯誤:(500)語法錯誤,命令無法識別的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!