20

HTTP プロキシの背後にあるときに FTP サーバーにファイルをアップロードする方法はありますか?

ファイルのアップロードは、.Net Webclient を使用した HTTP プロキシの背後ではサポートされていないようです。( http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.proxy.aspx )。

回避策がない場合は? そうでない場合は、私が使用できる優れた無料の FTP ライブラリを知っていますか?

編集:残念ながら、接続するFTPプロキシがありません。

4

13 に答える 13

9

アクティブ FTP モードでは、サーバーがクライアントへのデータ接続を開始します。クライアントが HTTP プロキシの背後にある場合、これは明らかに機能しません。パッシブ FTP モードでは、初期接続とデータ接続の両方を開始するのはクライアントです。HTTP プロキシは (CONNECT メソッドを使用して) 任意の発信 TCP 接続をトンネリングできるため、HTTP プロキシ経由でパッシブ モードで FTP サーバーにアクセスできるはずです。

FtpWebRequestパッシブモードをサポートしているようです。ただし、同じデータ接続を使用するファイルのアップロードがサポートされていないのに、ファイルのダウンロードとディレクトリのリストがサポートされている理由がわかりません。

FtpWebRequestディレクトリの一覧表示/ファイルのダウンロードが正常に機能する HTTP プロキシを介して、パッシブ モード用に構成された機能が動作しないことを確認しましたか?

于 2008-10-02T11:29:13.987 に答える
5

当社のRebex FTP/SSLは HTTP プロキシを使用できます。無料じゃないけど…

// initialize FTP client 
Ftp client = new Ftp();

// setup proxy details  
client.Proxy.ProxyType = FtpProxyType.HttpConnect;
client.Proxy.Host = proxyHostname;
client.Proxy.Port = proxyPort;

// add proxy username and password when needed 
client.Proxy.UserName = proxyUsername;
client.Proxy.Password = proxyPassword;

// connect, login 
client.Connect(hostname, port);
client.Login(username, password);

// do some work 
// ... 

// disconnect 
client.Disconnect();
于 2009-05-28T07:43:00.087 に答える
5

ほとんどの FTP プロキシは接続上で機能するため、プロキシがない場合は次のようにします。

  • サーバー: myftpserver.com
  • ユーザー: 私
  • パスワード: pwd

FTP プロキシを使用する場合は、次のようにします。

  • サーバー: ftpproxy.mydomain.com
  • ユーザー: me@myftpserver.com
  • パスワード: pwd

そして、そこからうまくいきます。私はイカプロキシを介してこれを使用しています(何かをデバッグしようとしています)。

...しかし、FTPプロキシを持っていないので....

SOCKS プロキシはありますか? それはうまくいくかもしれませんが、.NET でできるかどうかはわかりません。そうでなければ、正直言って、行き詰まっていると思います。FTP は、HTTP と比較すると、制御チャネル (ポート 21) とデータ チャネル (ランダムなポートで複数のチャネル) があるため、「奇妙な」プロトコルです。控えめに言って!

于 2008-10-02T11:31:57.207 に答える
4

.NET Framework 4.8 の時点では、 はFtpWebRequestまだHTTP プロキシ経由でファイルをアップロードできません

指定したプロキシが HTTP プロキシの場合、DownloadFile、ListDirectory、および ListDirectoryDe​​tails コマンドのみがサポートされます。

そして、FtpWebRequest現在は推奨されていないため、おそらく決してそうはなりません。そのため、サードパーティの FTP ライブラリを使用する必要があります。


たとえば、WinSCP .NET アセンブリでは、次を使用できます。

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "example.com",
    UserName = "user",
    Password = "mypassword",
};

// Configure proxy
sessionOptions.AddRawSettings("ProxyMethod", "3");
sessionOptions.AddRawSettings("ProxyHost", "proxy");

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Upload file
    string localFilePath = @"C:\path\file.txt";
    string pathUpload = "/file.txt";
    session.PutFiles(localFilePath, pathUpload).Check();
}

tje のオプションについては、 raw 設定SessionOptions.AddRawSettingsを参照してください。

WinSCP GUIで C# FTP コード テンプレートを生成する方が簡単です。

WinSCP .NET アセンブリはネイティブ .NET ライブラリではないことに注意してください。これはむしろ、コンソール アプリケーションに対する薄い .NET ラッパーです。

(私は WinSCP の作者です)

于 2015-11-03T15:34:23.607 に答える
3

1 つの解決策は、FtpWebRequest の Mono の実装を試すことです。ソース コードを確認したところ、すべての接続 (コントロールとデータ) が HTTP プロキシ経由でトンネリングされるように簡単に変更できるようです。

実際の FTP サーバーではなく、HTTP プロキシへの TCP 接続を確立します。次に、2 つの CRLF を続けて送信しますCONNECT myserver:21 HTTP/1.0(CRLF = \r\n)。プロキシで認証が​​必要な場合は、HTTP/1.1 を使用し、資格情報を含むプロキシ認証ヘッダーも送信する必要があります。次に、応答の最初の行を読む必要があります。HTTP/1.0 200 " " または " "で始まる場合HTTP/1.1 200 、(コードの残りの部分) は、FTP サーバーに直接接続されているかのように接続を使用し続けることができます。

于 2008-10-02T13:40:26.777 に答える
2

HTTPプロキシを介してコンテンツをftp:// URLにアップロードする標準的な方法は、HTTPPUTリクエストを使用することです。HTTPプロキシは、ftp:// URLを処理するときに、HTTP <-> FTPゲートウェイとして機能し、要求元のクライアントにHTTPを、要求されたFTPサーバーにFTPを送信します。

少なくともSquidHTTPプロキシはPUTからftp:// URLをサポートしていますが、他のプロキシが何をするのかはわかりません。

より一般的な方法は、CONNECTメソッドを悪用して、プロキシを介したトンネルを確立することです。ただし、プロキシを介した双方向トンネルを許可することのセキュリティ上の影響により、これは許可されないことがよくあります。

于 2011-06-27T22:20:24.517 に答える
2

アレクサンダーが言うように、HTTP プロキシは任意のトラフィックをプロキシできます。必要なのは、HTTP プロキシの使用をサポートする FTP クライアントです。アレクサンダーは、これがパッシブモードでのみ機能することも正しい.

私の雇用主はそのような FTP クライアントを販売していますが、これは非常に大規模なシステムの一部としてのみ提供されるエンタープライズ レベルのツールです。

あなたのニーズにより適したものは他にもあると確信しています。

于 2008-10-02T12:09:37.570 に答える
2

C# を使用せずに FTP 経由でファイルをアップロードする方法があれば、C# でも可能です。ブラウザまたは FTP クライアント経由のアップロードは機能しますか?

私が最も気に入っている 1 つの FTP ライブラリは、.NET FTP クライアント ライブラリです。

于 2008-10-02T11:42:05.483 に答える
2

こんにちは、私は同じ問題を抱えていました-解決策は、プロキシオブジェクトを作成し、defaultcredentials を派生させることでした-アプリケーションがネットワークアカウントで実行されていれば、これで問題ありません-

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));

System.Net.WebProxy proxy = System.Net.WebProxy.GetDefaultProxy();
proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;

// set the ftpWebRequest proxy
reqFTP.Proxy = proxy;

これで問題は解決しました。

于 2013-02-01T13:49:34.133 に答える
0

これらの不自由なアプリケーションとコンポーネントをくそー!!! これは、HTTP プロキシ経由でファイルを FTP にアップロードできるオープン ソースの C# コードです。

        public bool UploadFile(string localFilePath, string remoteDirectory)
    {
        var fileName = Path.GetFileName(localFilePath);
        string content;
        using (var reader = new StreamReader(localFilePath))
            content = reader.ReadToEnd();

        var proxyAuthB64Str = Convert.ToBase64String(Encoding.ASCII.GetBytes(_proxyUserName + ":" + _proxyPassword));
        var sendStr = "PUT ftp://" + _ftpLogin + ":" + _ftpPassword
            + "@" + _ftpHost + remoteDirectory + fileName + " HTTP/1.1\n"
            + "Host: " + _ftpHost + "\n"
            + "User-Agent: Mozilla/4.0 (compatible; Eradicator; dotNetClient)\n" + "Proxy-Authorization: Basic " + proxyAuthB64Str + "\n"
            + "Content-Type: application/octet-stream\n"
            + "Content-Length: " + content.Length + "\n"
            + "Connection: close\n\n" + content;

        var sendBytes = Encoding.ASCII.GetBytes(sendStr);

        using (var proxySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
        {
            proxySocket.Connect(_proxyHost, _proxyPort);
            if (!proxySocket.Connected)
                throw new SocketException();
            proxySocket.Send(sendBytes);

            const int recvSize = 65536;
            var recvBytes = new byte[recvSize];
            proxySocket.Receive(recvBytes, recvSize, SocketFlags.Partial);

            var responseFirstLine = new string(Encoding.ASCII.GetChars(recvBytes)).Split("\n".ToCharArray()).Take(1).ElementAt(0);
            var httpResponseCode = Regex.Replace(responseFirstLine, @"HTTP/1\.\d (\d+) (\w+)", "$1");
            var httpResponseDescription = Regex.Replace(responseFirstLine, @"HTTP/1\.\d (\d+) (\w+)", "$2");
            return httpResponseCode.StartsWith("2");
        }
        return false;
    }
于 2013-12-03T14:25:13.557 に答える
-1

私はちょうど同じ問題を抱えていました。

私の主な目標は、ファイルを ftp にアップロードすることでした。また、トラフィックがプロキシを通過するかどうかは気にしませんでした。

そのため、FTPWebRequest.Create(uri) の直後に FTPWebRequest.Proxy プロパティを null に設定しました。

そしてそれはうまくいきました。はい、私はこの解決策が最善の解決策ではないことを知っています。さらに、なぜそれが機能したのかわかりません。しかし、とにかく、目標は完了です。

于 2009-09-04T10:55:20.367 に答える
-5

http プロキシと ftp サーバーへのアップロードとの間の接続は実際にはわかりません。http プロキシ経由で http リソースにアクセスするための http プロキシ クラスを使用する場合。ftp は別のプロトコルであり、ftp プロキシは別のプロトコルを使用します。

于 2008-10-02T08:04:54.943 に答える