2

我有以下 c# 代码。它在针对 .NET 框架 3.5 或 2.0 编译时运行良好(我没有针对 3.0 对其进行测试,但它很可能也可以工作)。问题是,它在针对 .NET 框架 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);

问题在于调用 Stream S = Ftp.GetRequestStream(); ,它会抛出一个 WebException 实例,并带有消息“远程服务器返回错误:(500) 语法错误,命令无法识别”。

有人知道为什么会这样吗?

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。被动模式被认为是安全的,因为它确保所有数据流启动都来自网络内部(客户端)而不是外部(服务器)。

此外,根据 http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.usepassive.aspx上的 MSDN 文档

如果 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 回答