FtpWebRequest-验证失败,因为远程方已关闭传输流

时间:2018-09-14 09:54:55

标签: c# .net ftp ftpwebrequest

我在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;

0 个答案:

没有答案