我有以下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:之前的编辑不正确,我有点困惑......
答案 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>