非常に単純なコード スニペットで問題が発生しています。
private long getFTPLogLength()
{
long size;
FtpWebRequest ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURL));
ftpRequest.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
try
{
ftpRequest.ReadWriteTimeout = 6000;
ftpRequest.Method = WebRequestMethods.Ftp.GetFileSize;
FtpWebResponse respSize = (FtpWebResponse)ftpRequest.GetResponse();
size = respSize.ContentLength;
respSize.Close();
}
catch (Exception ex)
{
logLog.writeEntry(4, "Error getting logsize from FTP: " + ex.Message);
size = 0;
}
return size;
}
このメソッドのポイントは、明らかに特定のファイルの長さを取得することです。ここでの問題は、一部のサーバー (つまり、gameservers.com サーバー) では、このコードが機能しないことです。テストできる他のすべてのサーバータイプで動作します。
ヘルプを探しているときにこれを見つけました:C#FTP 550エラーで、1つのスラッシュと2つのスラッシュで試しましたが、それでも同じ結果が得られます。これをさらに一歩進めると、GetFileSize (SIZE) を実行したときにのみ 550 エラーが発生します。GetDateTime (MDTM) を実行すると、このエラーは発生しません。これにより、SIZE コマンドが無効になっている、またはそれを使用するアクセス権がない、と思われることになりますが、FileZilla (またはクライアント) を使用してサーバーに接続し、SIZE games_mp.log を実行すると、うまく動作します。
これは、例外発生後のデバッガーのスクリーンショットです (注: このゲーム サーバーは、このバグを修正する目的で購入したため、テストを楽しむために意図的に資格情報が残されています)。
サーバーでこれを機能させるために何をする必要があるかを理解するのに役立つ情報があれば、役に立ちます。うまくいけば、単純なものが欠けています。:)
さらにテストした後、FileZilla をタイムアウトさせた場合、手動でコマンドを実行すると、ASCII モードで SIZE がサポートされていないというエラーが表示されますが、サーバーへの新しい接続を開始すると問題なく動作します。
サーバーへの新規接続:
タイムアウト後のコマンド:
うまくいけば、これは誰かにとって何かを意味します....