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

标签 c# azure ftp azure-webjobs

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

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}");
    }
}

当从 Visual Studio 运行时,此代码可以完美运行。 但是,当在 Azure 中作为 Web 作业运行时,它只会下载几个文件,然后就永远挂起。

我没有遇到超时或异常。

我添加了一些调试日志,发现它卡在 GetResponseAsync() 上。 我在没有 ConfigureAwait(false) 的情况下尝试过,但得到了相同的行为。

我还用过this answer检查网络痕迹,但我在日志中找到的所有 FTP 命令都正常。对于成功下载的每个文件,我看到以下几行,但没有看到被阻止的文件有任何“不完整”的 FTP 命令:

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.)

任何帮助/领导将不胜感激!

编辑 1

我尝试使用 WebClient 而不是 FtpWebRequest 并得到了相同的结果。它在我的计算机上运行良好,但当在 Azure 上作为 Web 作业运行时,它会下载几个文件,然后卡在 webClient.DownloadFileTaskAsync(...) 行上。另外,为了确保上传到 Azure 存储不会干扰该过程,我现在只需在本地下载文件即可。还有阿吉:没有异常(exception),没有超时。它只是永远挂起。

编辑2

我尝试删除将文件上传到 Azure 存储的行,以防万一,但无济于事。然后,根据第一个评论者的建议,我添加了一个“超时包装器”,它本质上将我的代码作为任务运行,即 Task.Delay(10_000),并等待第一个任务完成。如果下载任务先完成,那么一切都很好,但如果 Task.Delay(10_000) 首先完成,我只需中止下载请求并重试。这样做时,我观察到以下情况:首先,文件在第一次尝试时全部下载。然后,某些文件需要 2 次尝试,并且在某个时刻,尽管尝试 10 次,所有文件都会失败。所以基本上,一切开始都很好,但很快就会退化。

最佳答案

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

无论如何,我希望这对将来的人有所帮助。

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

关于c# - 仅在 Azure Web 应用程序中从 FTP 下载文件失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48116875/

相关文章:

ftp - 为什么 Passive FTP 的使用频率更高?

c# - ESE 列类型到 XmlSerialize 任意对象

azure - 了解资源和权限 url

ubuntu - 为什么我的 pam_userdb.so 不见了?

Azure 导入数据层应用程序没有标准数据库选项

javascript - 移动服务服务器脚本(调度)可以访问其他 Sql Azure 数据库吗?

php - 使用 cURL 的 ftp 上传中的未知 SSL 协议(protocol)错误

c# - 如何创建一个在所有意图和目的上都像字符串一样的类型,因为我无法从字符串继承

c# - 当我从数据库表中删除所有行时,GridView 不显示

c# - 中间有箭头的画线