2

非常に単純なコード スニペットで問題が発生しています。

     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 がサポートされていないというエラーが表示されますが、サーバーへの新しい接続を開始すると問題なく動作します。

サーバーへの新規接続: ここに画像の説明を入力

タイムアウト後のコマンド: ここに画像の説明を入力

うまくいけば、これは誰かにとって何かを意味します....

4

3 に答える 3

2

FTP SIZE コマンドは、基本的な FTP RFC には存在せず、RFC 3659 にのみ追加されました。また、FTP のエラー 550 は「アクションを利用できません」です。つまり、サーバーは、そのようなコマンドをサポートしていないことを通知します。

于 2013-04-24T16:37:12.703 に答える
1

サーバーが FEAT コマンドをサポートしている場合は、それをサーバーに発行し、結果リストに「SIZE」が含まれているかどうかを確認します。これにより、サーバーが SIZE コマンドをサポートしているかどうかが明確にわかります。もちろん、これはサーバーが FEAT コマンド自体をサポートしていることを前提としています。

于 2013-04-26T00:58:23.943 に答える