【发布时间】:2017-01-25 18:18:27
【问题描述】:
更新(这个问题的原因):
好的,我设法 -在@MitchelSellers 的评论的帮助下 - 找出问题的确切位置,并且我正在努力寻找解决方案。
- 显然此服务器不允许使用命令
CWD(更改工作目录)。 - 现在使用
.NET 2.0下载文件 - 出于未知原因 - 它在登录后发送此命令,后跟/,以将工作目录更改为当前工作目录!!(如如下所示,并且我还确认将 FileZilla 与另一台服务器一起使用)。 - 同样如下所示,
.NET的最新版本并非如此,这就是它适用于.NET 4.x的原因。
所以,我正在尝试找到一种方法让它在 .NET 2.0 上工作。
原问题:
这是我的代码:
Private Sub DownloadTestFile()
Dim filePath As String = "ftp://ftp.kohlandfrisch.com/testfile"
Dim request As FtpWebRequest
Dim buffer(1023) As Byte
Dim bytesIn As Integer
request = DirectCast(WebRequest.Create(filePath), FtpWebRequest)
request.Method = WebRequestMethods.Ftp.DownloadFile
request.Credentials = New NetworkCredential("username", "password")
request.UseBinary = False
request.UsePassive = True
request.Proxy = Nothing
Using stream As IO.Stream = request.GetResponse.GetResponseStream
Using output = IO.File.Create(localFilePath)
bytesIn = 1
Do Until bytesIn < 1
bytesIn = stream.Read(buffer, 0, 1024)
If bytesIn > 0 Then output.Write(buffer, 0, bytesIn)
Loop
End Using
End Using
End Sub
在.NET 4 或4.x 上运行该代码时,它工作得非常好。但是在.NET 2.0 (我必须使用.NET 2.0) 上运行它时,调用request.GetResponse 时会引发异常。这是异常消息:
远程服务器返回错误:(501) 参数中的语法错误 或论据。
我发现.NET 2.0发送的请求一定有问题,所以我决定使用Wireshark捕获请求和响应,我的假设是正确的,但我仍然不明白是什么问题正是因为我在两个。.NET 版本上使用相同的代码
Wireshark 结果
.NET 4.5.2
.NET 2.0
有什么想法吗?
旁注:虽然我的代码是用 VB 编写的,但欢迎使用 C# 代码回答。
【问题讨论】:
-
尝试设置
.UsePassive = False看看是否适用于2.0... -
@Zaggler,已经尝试过了。更改
.UsePassive、.UseBinary或删除.Proxy = Nothing并不能解决问题。 -
尝试在文件 url 中使用 %2f 而不是 /。
-
@MitchelSellers,那会抛出一个
UriFormatException(试过了)。我认为character (/) not allowed in object name不是指文件路径,我认为它指的是请求CWD FTPCAS/,它只从.NET 2.0发送! -
看起来像。我只是找不到任何具体的文档说明原因。给您带来问题的是 CWD 呼叫
标签: c# .net vb.net ftp ftpwebrequest