使用 FtpWebRequest 将文件从 Azure 托管应用程序上传到外部 ftp 站点
Uploading file with FtpWebRequest from an azure hosted application to an external ftp site
UPDATE: I found out that it is not an issue with azure rather the
other party who are actually doing white-listing on incoming
connection.
我实现了一项服务,它打开 ftp 连接以将文件上传到远程 FTP 服务器。 该代码在我的桌面上运行完美 (!) 运行,但是如果我将它发布到 azure 托管云并使用完全相同的参数执行,我会收到 WebException 消息 'The remote server returned an error: (530) Not logged in.' 我在azure console中没有找到任何相关的设置。我也尝试了不同的设置,比如 on/off keep-alive 和 passive,但结果是一样的。你们知道可能是什么问题吗?
参考代码:
Dim request As FtpWebRequest
request = TryCast(WebRequest.Create($"ftp://{_host}/inventory/{_uploadFilename}"), FtpWebRequest)
request.Method = WebRequestMethods.Ftp.UploadFile
request.Credentials = New NetworkCredential(_username, _password)
request.UsePassive = True
request.UseBinary = True
request.KeepAlive = False
Using fs As FileStream = File.OpenRead(_fileName)
Dim buffer As Byte() = New Byte(fs.Length - 1) {}
fs.Read(buffer, 0, buffer.Length)
fs.Close()
Dim requestStream As Stream = request.GetRequestStream()
requestStream.Write(buffer, 0, buffer.Length)
requestStream.Flush()
requestStream.Close()
Dim response As FtpWebResponse = DirectCast(request.GetResponse(), FtpWebResponse)
Return Ok($"Remote server response: {response.StatusDescription}")
End Using
NetworkCredential
从哪里获取凭据?
Windows 身份验证 (Kerberos/NTLM) 在 Azure 中不起作用。您需要使用 FTP 登录(如 USER
和 PASS
FTP 命令)。
尝试从 Azure FTP 传输时始终使用 被动 模式。
Imports System.IO
Imports System.Net
Module Module1
Sub Main()
Dim request As FtpWebRequest
Dim _host = "remote.ftpserver.com"
Dim _uploadFilename = "file.txt"
Dim _filename = "file.txt"
Dim _username = "Username"
Dim _password = "PaSsw0rD"
request = TryCast(WebRequest.Create($"ftp://{_host}/path/{_uploadFilename}"),
FtpWebRequest)
request.Method = WebRequestMethods.Ftp.UploadFile
request.Credentials = New NetworkCredential(_username, _password)
request.UsePassive = True
request.UseBinary = True
request.KeepAlive = False
Using fs As FileStream = File.OpenRead(_filename)
Dim buffer As Byte() = New Byte(fs.Length - 1) {}
fs.Read(buffer, 0, buffer.Length)
fs.Close()
Dim requestStream As Stream = request.GetRequestStream()
requestStream.Write(buffer, 0, buffer.Length)
requestStream.Flush()
requestStream.Close()
Dim response As FtpWebResponse = DirectCast(request.GetResponse(),
FtpWebResponse)
Console.WriteLine($"Remote server response: {response.StatusCode},
{response.StatusDescription}")
End Using
End Sub
End Module
抱歉,格式到处都是。这是我第一次尝试写 VB.
运行 为了清晰起见,Kudu's DebugConsole 中的这个 - 与 Web 应用程序相同的沙箱:
在远程 FTP 服务器上:
ftp> ls file.txt
200 PORT command successful.
125 Data connection already open; Transfer starting.
file.txt
226 Transfer complete.
ftp: 13 bytes received in 0.02Seconds 0.81Kbytes/sec.
ftp> bin
200 Type set to I.
ftp> get file.txt
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
ftp: 24 bytes received in 0.18Seconds 0.14Kbytes/sec.
ftp> !type file.txt
Upped with FtpWebRequest
我发现这不是天蓝色的问题,而是实际上在传入连接上进行白名单的另一方的问题。
UPDATE: I found out that it is not an issue with azure rather the other party who are actually doing white-listing on incoming connection.
我实现了一项服务,它打开 ftp 连接以将文件上传到远程 FTP 服务器。 该代码在我的桌面上运行完美 (!) 运行,但是如果我将它发布到 azure 托管云并使用完全相同的参数执行,我会收到 WebException 消息 'The remote server returned an error: (530) Not logged in.' 我在azure console中没有找到任何相关的设置。我也尝试了不同的设置,比如 on/off keep-alive 和 passive,但结果是一样的。你们知道可能是什么问题吗?
参考代码:
Dim request As FtpWebRequest
request = TryCast(WebRequest.Create($"ftp://{_host}/inventory/{_uploadFilename}"), FtpWebRequest)
request.Method = WebRequestMethods.Ftp.UploadFile
request.Credentials = New NetworkCredential(_username, _password)
request.UsePassive = True
request.UseBinary = True
request.KeepAlive = False
Using fs As FileStream = File.OpenRead(_fileName)
Dim buffer As Byte() = New Byte(fs.Length - 1) {}
fs.Read(buffer, 0, buffer.Length)
fs.Close()
Dim requestStream As Stream = request.GetRequestStream()
requestStream.Write(buffer, 0, buffer.Length)
requestStream.Flush()
requestStream.Close()
Dim response As FtpWebResponse = DirectCast(request.GetResponse(), FtpWebResponse)
Return Ok($"Remote server response: {response.StatusDescription}")
End Using
NetworkCredential
从哪里获取凭据?
Windows 身份验证 (Kerberos/NTLM) 在 Azure 中不起作用。您需要使用 FTP 登录(如 USER
和 PASS
FTP 命令)。
尝试从 Azure FTP 传输时始终使用 被动 模式。
Imports System.IO
Imports System.Net
Module Module1
Sub Main()
Dim request As FtpWebRequest
Dim _host = "remote.ftpserver.com"
Dim _uploadFilename = "file.txt"
Dim _filename = "file.txt"
Dim _username = "Username"
Dim _password = "PaSsw0rD"
request = TryCast(WebRequest.Create($"ftp://{_host}/path/{_uploadFilename}"),
FtpWebRequest)
request.Method = WebRequestMethods.Ftp.UploadFile
request.Credentials = New NetworkCredential(_username, _password)
request.UsePassive = True
request.UseBinary = True
request.KeepAlive = False
Using fs As FileStream = File.OpenRead(_filename)
Dim buffer As Byte() = New Byte(fs.Length - 1) {}
fs.Read(buffer, 0, buffer.Length)
fs.Close()
Dim requestStream As Stream = request.GetRequestStream()
requestStream.Write(buffer, 0, buffer.Length)
requestStream.Flush()
requestStream.Close()
Dim response As FtpWebResponse = DirectCast(request.GetResponse(),
FtpWebResponse)
Console.WriteLine($"Remote server response: {response.StatusCode},
{response.StatusDescription}")
End Using
End Sub
End Module
抱歉,格式到处都是。这是我第一次尝试写 VB.
运行 为了清晰起见,Kudu's DebugConsole 中的这个 - 与 Web 应用程序相同的沙箱:
在远程 FTP 服务器上:
ftp> ls file.txt
200 PORT command successful.
125 Data connection already open; Transfer starting.
file.txt
226 Transfer complete.
ftp: 13 bytes received in 0.02Seconds 0.81Kbytes/sec.
ftp> bin
200 Type set to I.
ftp> get file.txt
200 PORT command successful.
125 Data connection already open; Transfer starting.
226 Transfer complete.
ftp: 24 bytes received in 0.18Seconds 0.14Kbytes/sec.
ftp> !type file.txt
Upped with FtpWebRequest
我发现这不是天蓝色的问题,而是实际上在传入连接上进行白名单的另一方的问题。