从FTP下载文件仅在Azure Web应用程序中失败

时间:2018-01-05 15:44:02

标签: c# azure ftp azure-webjobs

我有这个非常基本的代码,可以从FTP服务器下载文本文件列表:

accept()

从Visual Studio运行时,此代码完美运行。 但是当在Azure中作为Web作业运行时,它只会在永久挂起之前下载几个文件。

我没有超时或例外。

我添加了一些调试日志,发现它卡在foreach (var fileUri in files) { try { var ftpRequest = (FtpWebRequest)FtpWebRequest.Create(fileUri); ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile; ftpRequest.Credentials = new NetworkCredential("***", "***"); ftpRequest.UseBinary = false; ftpRequest.Timeout = 10_000; ftpRequest.ReadWriteTimeout = 10_000; using (WebResponse response = await ftpRequest.GetResponseAsync().ConfigureAwait(false)) using (var stream = response.GetResponseStream()) { // Copy the file to an Azure storage await CopyAsync(stream, container, GetFilename(fileUri), false).ConfigureAwait(false); } } catch (Exception e) { Logger.Error(Unknow, $"Error downloading {fileUri.AbsoluteUri}:\n{e}"); } } 上。 我试过没有GetResponseAsync(),但也有同样的行为。

我还使用this answer来检查网络跟踪,但是我在日志中找到的所有FTP命令都没问题。我看到成功下载的每个文件都有以下行,但是看不到任何"不完整的"阻止文件的FTP命令:

ConfigureAwait(false)

非常感谢任何帮助/领导!

编辑1

我尝试使用System.Net Information: 0 : [22712] FtpWebRequest#2543959::.ctor(ftp://<ftpserver>/<filename>) System.Net Information: 0 : [21728] FtpWebRequest#2543959::BeginGetResponse(Method=RETR.) System.Net Information: 0 : [21728] Associating FtpWebRequest#2543959 with FtpControlStream#64735656 System.Net Information: 0 : [21728] FtpControlStream#64735656 - Sending command [PASV] System.Net Information: 0 : [9444] FtpControlStream#64735656 - Received response [227 Entering Passive Mode (104,45,19,12,117,54).] System.Net Information: 0 : [9444] FtpControlStream#64735656 - Sending command [RETR <filename>] System.Net Information: 0 : [17608] FtpControlStream#64735656 - Received response [150 Opening ASCII mode data connection for <filename> (19262 bytes)] System.Net Information: 0 : [21804] FtpControlStream#64735656 - Received response [226 Transfer complete] System.Net Information: 0 : [21804] FtpWebRequest#2543959::(Releasing FTP connection#64735656.) 代替WebClient并获得相同类型的结果。它在我的机器上运行良好,但是当作为Web作业在Azure上运行时,它会下载几个文件,然后挂起FtpWebRequest行。另外,为了确保我上传到Azure存储不会干扰过程,我现在只需在本地下载文件。并且agin:没有例外也没有超时。它只是永远挂起。

编辑2

我尝试删除将文件上传到我的Azure存储的行,以防万一,但无济于事。然后,按照第一个评论者的建议,我添加了一个&#34;超时包装器&#34;基本上将我的代码作为任务运行,webClient.DownloadFileTaskAsync(...),然后等待第一个任务完成。如果下载任务首先完成,那么一切都很好,但如果Task.Delay(10_000)首先完成,我只是中止下载请求并再试一次。这样做,我观察到以下内容:首先,文件在第一次尝试时全部下载。然后,一些文件需要2次尝试,并且在某些时候,尽管有10次尝试,但所有文件都会失败。所以基本上,一切都很好,但很快就会降级。

1 个答案:

答案 0 :(得分:0)

Sooo ...我觉得有点愚蠢,但问题不在我猜测的代码中。这只是CPU使用率的问题。我最终发现(在Azure支持的帮助下)我在同一个应用服务计划上有其他Web作业,而这些Web作业占用的CPU太多了。但坦率地说,我发现这些症状非常具有误导性。

无论如何,我希望这将有助于将来的某个人。

TL; DR 始终检查您的CPU使用情况!