我在httphandler内部有代码,我正在使用网站上的服务文件。基本上,它被用作动态替换,而不是直接链接到文件。它以一个ID作为输入,检查数据库和权限,然后以关联的文件进行响应。文件本身存储在异地的其他位置。我被指示使用ftp将文件带回到我们的服务器。我们的服务器环境正在使用.net 3.5。
当一次只有一个ftp操作时,我拥有的代码可以正常工作。
但是,当同时多次调用httphandler时(例如,如果4个人使用一次或一个人一次执行4次),则某些执行将失败,并显示错误远程服务器返回错误:150打开数据从XXX的服务器下载文件的通道:验证失败,因为远程方已关闭传输流。
当我遇到此问题时,我最初使用的是fluentFTP 3rd party库。我以为可能是引起问题的第三方库,所以在调试中,我移到了在下面的代码中仅使用FtpWebRequest,但是发生了相同的错误。
过去几天,我一直在研究可能的修复程序。已经尝试了很多常见的反应,但都没有用:
设置ServicePointManager.SecurityProtocol
设置较高的连接限制
为每次执行设置连接组。
这些更改均未对代码的执行方式产生任何影响。
下面是代码摘要
try
{
//Hook a callback to verify the remote certificate
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(MyCertValidationCb);
ServicePointManager.SecurityProtocol = ServicePointManager.SecurityProtocol = (SecurityProtocolType)48 | (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072;
FtpWebRequest reqFTP = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + hostAddress + downloadByFtpSource));
reqFTP.Credentials = new NetworkCredential(ftpUSername, ftpPassword);
reqFTP.EnableSsl = true;
reqFTP.UsePassive = true;
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.KeepAlive = false;
reqFTP.ServicePoint.ConnectionLimit = 100;
Random r = new Random();
var debugTestingRandomNumber = (-1 * r.Next(1000000));
string debugTestingGroupName = "MyGroupName" + debugTestingRandomNumber.ToString();
reqFTP.ConnectionGroupName = debugTestingGroupName;
using (Stream ftpStream = reqFTP.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(downloadByFtpDestination))
{
CopyTo(ftpStream, fileStream);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
var debuggingTest = response.StatusCode.ToString();
result = true;
}
reqFTP.ServicePoint.CloseConnectionGroup(debugTestingGroupName);
}
catch (Exception ex)
{
result = false;
}
编辑:添加reqFTP.UseBinary = true;