2016-09-27 27 views
0

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.使用FtpWebRequest从Azure托管应用程序上传文件到外部FTP站点

我实现了一个服务,该服务通过打开和ftp连接将文件上传到远程FTP服务器。 该代码完美运行在我的桌面上(!),但是,如果我将其发布到Azure托管云并使用完全相同的参数执行,我会收到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 
+0

[启用日志记录](http://stackoverflow.com/q/9664650/850848)并向我们显示来自桌面和Azure的日志。 –

回答

0

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

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应用程序:

Run-in-Kudu

在远程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 
+0

谢谢你看看我的问题,但我认为这不是一个Kerberos身份验证。这只是一个简单的基础。我在本地ftp服务器上运行代码,这里是执行的相关命令: 2016-09-28 19:16:48 :: 1 - :: 1 21 USER匿名331 0 0 72cfd8e0-20c5-48ad-af21 -df2443de8605 - 2016-09-28 19:16:48 :: 1 - :: 1 21 PASS [email protected] 230 0 0 72cfd8e0-20c5-48ad-af21-df2443de8605/ 但是我有点兴趣你怎么做测试。你有没有上传vb控制台应用程序到天蓝? – kexx

+0

是的。拖放到Kudu控制台。链接在我的答案。 – evilSnobu

相关问题