9

VS2008 をデバッガとして使用して C# コードから Win 2008 Server に FTP しようとすると、例外が発生し続けます。

私のテストクラスは次のようになります。

public class FTP
{
    private string ftpServerIP = "192.168.10.35:21";
    private string ftpUserID = "Administrator";
    private string ftpPassword = "XXXXXXXX";
    private string uploadToFolder = "uploadtest";

    public void Upload(string filename)
    {
        FileInfo fileInf = new FileInfo(filename);
        string uri = "ftp://" + ftpServerIP + "/" + uploadToFolder + "/" + fileInf.Name;
        FtpWebRequest reqFTP;

        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        reqFTP.KeepAlive = false;
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
        reqFTP.UseBinary = true;
        reqFTP.ContentLength = fileInf.Length;

        int buffLength = 2048;
        byte[] buff = new byte[buffLength];
        int contentLen;

        FileStream fs = fileInf.OpenRead();
        try
        {
            Stream strm = reqFTP.GetRequestStream();
            contentLen = fs.Read(buff, 0, buffLength);

            while (contentLen != 0)
            {
                strm.Write(buff, 0, contentLen);
                contentLen = fs.Read(buff, 0, buffLength);
            }

            strm.Close();
            fs.Close();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }
}

コードを実行すると、GetRequestStream() 呼び出しで FTP エラー 227 で接続に失敗しました。例外では、接続が失敗することがわかります: 192.168.10.35:52184

ポート 52184 がどのように生成されるのかわかりません。ftpServerIP で、ポート 21 であることを指定します。

Googleで同じ問題を抱えている人を何人か見つけましたが、これがどのように解決されるかについての良い例を見つけられず、なぜそれが起こるのかまだわかりません.

誰でもこの問題を処理する方法を知っていますか??

アップデート:

別の FTP アカウントに接続しようとしましたが、すべて正常に動作します。したがって、192.168.10.35:21 FTP をテストしましたが、CuteFTP Pro などでは問題なく動作します。これはそれをさらに奇妙にします..

4

3 に答える 3

7

私の推測では、Windows ファイアウォールの問題で、FTP はポート 21 以外のポートを使用します。FTP モードをアクティブからパッシブに変更すると、動作するようになることがあります。

reqFTP.UsePassive = false;

FTP に関するこの優れた記事を見てください: Active FTP vs. Passive FTP, a Definitive Explanation

于 2009-05-18T08:25:27.277 に答える
4

これは正しかった、それはパッシブモードに関係していた

コードの修正は非常に単純です:)

reqFTP.UsePassive = false;

そして、それは高速でエラーなしで機能しました!

于 2009-05-18T09:08:25.460 に答える