Ftp仅在.NET 4.0中抛出WebException

时间:2011-01-05 13:44:24

标签: .net c#-4.0 ftp alfresco

我有以下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);

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

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

PS。我在ECM Alfresco中与虚拟ftp服务器通信。

编辑:我最近发现,在Windows 7上不可能有.NET framework 3.5 Windows服务,所以解决这个问题会很好。我需要做的是将文件上传到ftp - c#中有另一种(工作)方式吗?

edit2:之前的编辑不正确,我有点困惑......

2 个答案:

答案 0 :(得分:4)

我在这里找到了类似的帖子http://bytes.com/topic/net/answers/792209-problems-ftpwebrequest-getrequeststream-c

分辨率适用于该人。

试试这个:

更改

reqFTP.UsePassive = true;

reqFTP.UsePassive = false;
  

UsePassive:指定是否使用   主动或被动模式。   早些时候,主动FTP工作正常   所有的客户,但现在,作为大多数客户   随机端口被a阻止   防火墙,活动模式可能会失败。   被动FTP对此很有帮助   案件。但是,它仍会导致问题   服务器。请求更高的端口   也可以是服务器上的客户端   被防火墙阻止。但是因为   FTP服务器需要制作他们的   服务器可访问最大的   客户数量,他们差不多   当然需要支持被动FTP。   被动模式被认为是安全的   因为它确保了所有数据流   启动来自内部(客户端)   网络而不是网络   外(服务器)。

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

  

如果UsePassive设置为true,则为FTP   服务器可能不会发送的大小   文件,并始终下载进度   为零。如果UsePassive设置为   假,防火墙可以发出警报   并阻止文件下载。

答案 1 :(得分:0)

我有类似的问题。我正在使用FTP.Net 2.0,我的应用程序是在FW4.0目标上编译的。我通过在app.config文件中添加一个属性来解决它:

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

此处提供更多信息:What 'additional configuration' is necessary to reference a .NET 2.0 mixed mode assembly in a .NET 4.0 project?