我正在尝试以编程方式通过FTP以C#方式下载文件,这里是相关代码(显然有假信用证和URI):
try
{
var request = FtpWebRequest.Create("ftp://ftp.mydomain.com/folder/file.zip");
request.Credentials = new NetworkCredential("username", "password");
using (var response = request.GetResponse())
{
...
}
}
catch (WebException we)
{
...
}
在request.GetResponse()
抛出异常,错误代码为550.问题不在于凭据或URI,因为它们在IE中工作正常并且文件在那里成功下载。我错过了什么?我应该使用其他类型的凭据对象吗?我没有设置request
对象上的属性吗?任何帮助将不胜感激。
答案 0 :(得分:6)
原来FTP根目录不一定与URL根目录相同。也许我混淆了术语,所以让我解释一下:在我的情况下,连接到ftp.mydomain.com已经从/文件夹开始,所以我的URL只需要ftp://ftp.mydomain.com/file.zip。 IE8知道如何消除原始路径中的冗余/文件夹部分,而FtpRequest类没有,这就是为什么它在IE8中工作但在C#代码中没有。
答案 1 :(得分:4)
在本地路径部分的开头添加另一个斜杠(在hostname:port之后):
var request = FtpWebRequest.Create("ftp://ftp.mydomain.com//folder/file.zip");
这对我有用。
答案 2 :(得分:1)
这是我使用的,我敢打赌.Method是你想要的主要内容
request = (FtpWebRequest)FtpWebRequest.Create(address);
request.Credentials = new NetworkCredential("username", "password");
request.UsePassive = true;
request.UseBinary = true;
request.Proxy = null;
request.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse dataResponce = (FtpWebResponse)request.GetResponse();
答案 3 :(得分:1)
您尚未设置Method
。
request.Method = WebRequestMethods.Ftp.DownloadFile;
答案 4 :(得分:1)
与我的FTP服务器的连接显示不同的行为,具体取决于我尝试连接的位置。在我的本地网络中,它仅在域部分之后使用一个斜杠,例如 ftp://test.test.com/folder/myfile.txt
但是在远程机器上我必须使用两个斜杠,如ftp://test.test.com//folder/myfile.txt
两种情况都采用双斜线方法。
答案 5 :(得分:0)
我最近遇到了这个问题,经过大量测试后发现,这里和那里之间的某些模块不喜欢混合大小写的URI,因此我的决议是在URI上使用.ToLower()