我在使用Renci SSH SFTP将文件从ASP.NET服务器上传到CDN(Akamai)时遇到了问题。在问题出现之前,我们一直在使用FTP上传媒体文件,但超过50MB的文件会出现502 Bad Gateway错误。考虑到安全性,我们想升级到SFTP,因此我们更换了FTP代码并尝试使用SFTP来解决问题。在开发和QA环境中,这似乎解决了问题,但流量比生产服务器低得多。一旦投入生产,我们进行了约3k次上传,其中约30%失败,并出现以下错误,该错误源于Renci SSH.Net。
有趣的是,只有在ASP.NET执行代码时才会发生这种情况。我创建了一个控制台应用程序,调用Services.dll,提供媒体文件的路径,并提供一个相当大的测试媒体列表,大小从800 KB到187 MB不等。在作为控制台应用程序在服务器上运行时,没有抛出任何错误。因此,我认为问题可能出现在ASP.NET、IIS或某些我不知道的服务器设置中。
我们的防火墙已经设置允许通过22号端口进行与Akamai的通信,这一点我已经让我的团队验证了每个负载均衡服务器。由于控制台应用程序正常运行,我不认为这是问题所在。但值得一提的是,我已经查看了上传媒体项所调用的管理面板,它位于一个名为“upload.aspx”的aspx页面上。在Web配置文件中,我们将upload.aspx的执行超时时间延长到了这个时间:
这里是建立连接的代码。
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
有趣的是,只有在ASP.NET执行代码时才会发生这种情况。我创建了一个控制台应用程序,调用Services.dll,提供媒体文件的路径,并提供一个相当大的测试媒体列表,大小从800 KB到187 MB不等。在作为控制台应用程序在服务器上运行时,没有抛出任何错误。因此,我认为问题可能出现在ASP.NET、IIS或某些我不知道的服务器设置中。
我们的防火墙已经设置允许通过22号端口进行与Akamai的通信,这一点我已经让我的团队验证了每个负载均衡服务器。由于控制台应用程序正常运行,我不认为这是问题所在。但值得一提的是,我已经查看了上传媒体项所调用的管理面板,它位于一个名为“upload.aspx”的aspx页面上。在Web配置文件中,我们将upload.aspx的执行超时时间延长到了这个时间:
<location path="path/to/upload.aspx">
<system.web>
<httpRuntime maxRequestLength="204800" executionTimeout="2700" />
</system.web>
</location>
这里是建立连接的代码。
using(var client = new SftpClient(GetConnectionInfo()))
{
client.ConnectionInfo.Timeout = TimeSpan.FromMinutes(5);
//This is the line that is hit before the error.
//It attempts to connect for about 20 seconds and throws an error.
//Happens with or without ConnectionInfo.Timeout being set.
client.Connect();
//perform logic to upload file, then disconnect
client.Disconnect();
}
最后一点,上传任何文件的时间长度比使用FTP显著慢。我听说其他公司也发生过这种情况,因此不感到意外,但这可能有助于解决问题。
有人有什么想法是什么导致了这个问题吗?