2

次のc#コードがあります。.NET Framework 3.5 または 2.0 に対してコンパイルすると問題なく動作します (3.0 に対してはテストしていませんが、おそらく動作するでしょう)。問題は、.NET Framework 4.0 に対してビルドすると失敗することです。

        FtpWebRequest Ftp = (FtpWebRequest)FtpWebRequest.Create(Url_ + '/' + e.Name);

        Ftp.Method = WebRequestMethods.Ftp.UploadFile;
        Ftp.Credentials = new NetworkCredential(Login_, Password_);
        Ftp.UseBinary = true;
        Ftp.KeepAlive = false;
        Ftp.UsePassive = true;

        Stream S = Ftp.GetRequestStream();

        byte[] Content = null;
        bool Continue = false;
        do
        {
            try
            {
                Continue = false;
                Content = File.ReadAllBytes(e.FullPath);
            }
            catch (Exception)
            {
                Continue = true;
                System.Threading.Thread.Sleep(500);
            }
        } while (Continue);

        S.Write(Content, 0, Content.Length);
        S.Close();

        FtpWebResponse Resp = (FtpWebResponse)Ftp.GetResponse();
        if (Resp.StatusCode != FtpStatusCode.CommandOK)
            Console.WriteLine(Resp.StatusDescription);

問題は call Stream S = Ftp.GetRequestStream();にあります。これは、「リモート サーバーがエラーを返しました: (500) 構文エラー、コマンドを認識できません」というメッセージとともに WebException の en インスタンスをスローします。

なぜそうなのか誰か知っていますか?

PS。ECM Alfresco の仮想 ftp サーバーと通信します。

編集: 最近、Windows 7 で .NET Framework 3.5 Windows サービスを使用できないことがわかったので、この問題を解決できれば幸いです。私がする必要があるのは、ファイルを ftp にアップロードすることです - C# で別の (動作する) 方法はありますか?

edit2: 前の編集は正しくありません。やや混乱しました ...

4

2 に答える 2

4

ここで同様の投稿を見つけましたhttp://bytes.com/topic/net/answers/792209-problems-ftpwebrequest-getrequeststream-c

その人のために働いた決意で。

これを試して:

変化する

reqFTP.UsePassive = true;

reqFTP.UsePassive = false;

UsePassive:アクティブモードとパッシブモードのどちらを使用するかを指定します。以前は、アクティブFTPはすべてのクライアントで正常に機能していましたが、現在、ほとんどのランダムポートがファイアウォールによってブロックされているため、アクティブモードが失敗する可能性があります。この場合、パッシブFTPが役立ちます。しかし、それでも、サーバーで問題が発生します。サーバー上のクライアントによって要求された上位のポートも、ファイアウォールによってブロックされている可能性があります。ただし、FTPサーバーは、サーバーを最も多くのクライアントがアクセスできるようにする必要があるため、ほぼ確実にパッシブFTPをサポートする必要があります。パッシブモードは、すべてのデータフローの開始が外部(サーバー)からではなく、ネットワークの内部(クライアント)から行われることを保証するため、安全であると見なされます。

また、MSDNドキュメント( http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.usepassive.aspx )によると

UsePassiveがtrueに設定されている場合、FTPサーバーはファイルのサイズを送信しない可能性があり、ダウンロードの進行状況は常にゼロになる可能性があります。UsePassiveがfalseに設定されている場合、ファイアウォールはアラートを発生させ、ファイルのダウンロードをブロックする可能性があります。

于 2011-01-05T13:50:53.903 に答える
0

同様の問題がありました。FTP.Net 2.0 を使用しており、アプリケーションは FW4.0 ターゲットでコンパイルされています。app.config ファイルにプロパティを追加して解決しました:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

詳細はこちら: .NET 4.0 プロジェクトで .NET 2.0 混合モード アセンブリを参照するには、どのような「追加構成」が必要ですか?

于 2014-05-27T12:42:33.147 に答える