使用 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 登录(如 USERPASS 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

我发现这不是天蓝色的问题,而是实际上在传入连接上进行白名单的另一方的问题。