【问题标题】:Uploading file with FtpWebRequest from an azure hosted application to an external ftp site将带有 FtpWebRequest 的文件从 azure 托管应用程序上传到外部 ftp 站点
【发布时间】:2016-09-27 18:57:19
【问题描述】:

更新:我发现这不是 azure 的问题,而是 实际上正在对传入进行白名单的另一方 连接。

我实现了一个服务,它打开和 ftp 连接,将文件上传到远程 FTP 服务器。 代码在我的桌面上运行完美(!),但是如果我将它发布到天蓝色托管云并使用完全相同的参数执行,我会得到 WebException 并显示消息“远程服务器返回错误:(530)不是已登录。' 我在 azure 控制台中没有找到任何相关设置。我也尝试了不同的设置,如开/关保持活动和被动,但结果是一样的。你们知道可能是什么问题吗?

参考代码:

            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

【问题讨论】:

  • Enable logging 并向我们展示来自您的桌面和 Azure 的日志。

标签: vb.net azure file-upload ftp ftpwebrequest


【解决方案1】:

NetworkCredential 从哪里获取凭据?

Windows 身份验证 (Kerberos/NTLM) 在 Azure 中不起作用。您需要使用 FTP 登录(如 USERPASS FTP 命令)。

尝试从 Azure 进行 FTP 传输时,请始终使用 PASSIVE 模式。

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

【讨论】:

  • 感谢您查看我的问题,但我认为这与 kerberos 身份验证无关。这只是一个简单的基础。我在本地 ftp 服务器上运行代码,执行的相关命令如下: 2016-09-28 19:16:48 ::1 - ::1 21 USER anonymous 331 0 0 72cfd8e0-20c5-48ad-af21-df2443de8605 - 2016-09-28 19:16:48 ::1 - ::1 21 PASS devtest@helloka.com 230 0 0 72cfd8e0-20c5-48ad-af21-df2443de8605 / 但是我有点感兴趣你是如何进行测试的。您是否以某种方式将 vb 控制台应用程序上传到 azure?
  • 是的。拖放到 Kudu 控制台。链接我的答案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多