【问题标题】:Suddenly getting "150 Opening Data channel for file download from server" after the FTP downloads was working for yearsFTP 下载工作多年后突然出现“150 从服务器下载文件的打开数据通道”
【发布时间】:2020-02-06 09:59:07
【问题描述】:

我使用带有 C# 的 ASP.NET 制作文件传输应用程序,在该应用程序中,我将文件从 FTP 位置传输到我的服务器位置。这在过去 5 年中运行良好,但在此之后我现在遇到了错误。

远程服务器返回错误:150 打开从服务器下载文件的数据通道

我正在使用的代码如下

private string script = @"setTimeout(""__doPostBack('{0}','')"", 3000);";
protected int totalSteps = (intCount == 0 ? 1 : intCount);
private int blockWidth = 860 / (intCount == 0 ? 1 : intCount);
private string styles = @"
        <style type=""text/css"">
            .Hide {{ display:none; }}
            .ProgressWrapper {{ height:18px; width:{0}px; 
                    border:solid 1px #9C9C9C;font-size:9pt; padding:5px; background-color:#ddd; }}
            .Progress {{ height:15px; background-color:#0059FF; 
                    border:solid 1px #003EB0; float:left; }}
        </style>
    ";

public bool Processing
{
    get
    {
        return (bool)(Session["Processing"] ?? false);
    }
    set
    {
        Session["Processing"] = value;
    }
}
public int Step
{
    get
    {
        return (int)(Session["Step"] ?? 0);
    }
    set
    {
        Session["Step"] = value;
    }
}
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    if (this.Processing)
    {
        if (!string.IsNullOrEmpty(this.LastStatus))
        {
            this.pnlProgress.Width = new Unit(this.Step * this.blockWidth);
            if (this.Status == "Transfer" || this.Status == "Delete")
            {
                //some controls logic
            }
            if (this.Status == "TransferA" || this.Status == "DeleteD")
            {
                fBindClientGrid(this.FTPP, this.Label);
             //some controls logic
            }
            this.lblMessage.Text += string.Format("<br />{0}", this.LastStatus);
            this.LastStatus = string.Empty;
        }
        if (Session["ID"] == null)
            ScriptManager.RegisterStartupScript(this, this.GetType(),
                this.GetType().Name, string.Format(script, this.upnlCustomer.UniqueID),
                true);
    }
    else
    {
        if (!this.Completed)
        {
            this.pnlProgress.Width = new Unit(860);
            if (this.Status == "TransferA" || this.Status == "DeleteD")
            {
                fBindClientGrid(this.FTPP, this.Label);
            }
            fBindSubClientGrid(strTodaysDate);
            this.lblMessage.Text += string.Format("<br />{0}", this.LastStatus);
            lblMessage.Text += "<br />Processing Is Completed  At " + DateTime.Now.ToString("HH:mm:ss") + "";
            lblTransferStatus.Text = strfinalstatus;
         }
        else
        {
                         this.Step = 0;
        }
    }
  
}


void SomeLongOperation()
{
    this.Completed = false;

    List<string> lstArray = new List<string>();

    rdrCustomerCredentials.Close();
    rdrCustomerCredentials.Dispose();

    CreateFolder(strPath, strClientpath, strClientUser, strClientPwd, strTodaysDate);
    if (txtBatchName.Text.Trim().Replace("&", "").Replace("%", "").Replace("/", "").Replace(@"\", "").Replace("*", "").Replace(":", "").Replace("?", "").Replace("<", "").Replace(">", "").Replace("|", "").Replace("'", "''").Replace("é", "e") != strTodaysDate.Replace(ddlSubClient.SelectedValue.Split('^')[0], ""))
    {
        CreateFolder((strPath + strTodaysDate + "/"), strClientpath + strTodaysDate + "/", strClientUser, strClientPwd, txtBatchName.Text.Trim().Replace("&", "").Replace("%", "").Replace("/", "").Replace(@"\", "").Replace("*", "").Replace(":", "").Replace("?", "").Replace("<", "").Replace(">", "").Replace("|", "").Replace("é", "e"));
    }

    if (mySql.pReturnIntegerValue("SELECT COUNT(*) FROM CMTB****hMaster WHERE BatchName='" + txtBatchName.Text.Trim().Replace("&", "").Replace("%", "").Replace("/", "").Replace(@"\", "").Replace("*", "").Replace(":", "").Replace("?", "").Replace("<", "").Replace(">", "").Replace("|", "").Replace("'", "''").Replace("é", "e") + "' AND MTSubClientID=" + intSubClientID + " AND FolderName='" + strTodaysDate + "'") == 0)
    {

        strResult = ""; // here i add some operation to save data into my database
    }

    int i = 0;
    intCount = (gvCustomer.Rows.Count == 0 ? 1 : gvCustomer.Rows.Count);
    if (strResult == "")
    {
        for (int intLoop = 0; intLoop < gvCustomer.Rows.Count; intLoop++)
        {
            if (((CheckBox)gvCustomer.Rows[intLoop].Cells[0].FindControl("chkSelect")).Checked == true && ((LinkButton)gvCustomer.Rows[intLoop].Cells[2].FindControl("lnkLink")).Text.ToLower().Trim().Replace("\r\n", "").Replace("\n", "").Replace("//", "/").Contains(".ds2") == false && ((CheckBox)gvCustomer.Rows[intLoop].Cells[0].FindControl("chkSelect")).Enabled == true)
            {
                i++;
                string strFileName = ((LinkButton)gvCustomer.Rows[intLoop].Cells[2].FindControl("lnkLink")).Text.Trim().Replace("\r\n", "").Replace("\n", "").Replace("//", "/");

                string strConvFileName = ((TextBox)gvCustomer.Rows[intLoop].Cells[3].FindControl("txtConvertedFile")).Text.Trim().Replace("\r\n", "").Replace("\n", "").Replace("//", "/").Replace("  ", "").Replace("~", "-").Replace("é", "e");

                this.Step = this.Step + 1;
                if (txtBatchName.Text.Trim().Replace("&", "").Replace("%", "").Replace("/", "").Replace(@"\", "").Replace("*", "").Replace(":", "").Replace("?", "").Replace("<", "").Replace(">", "").Replace("|", "").Replace("é", "e") != strTodaysDate.Replace(ddlSubClient.SelectedValue.Split('^')[0], ""))
                {
                    strResult = RecursiveDownload((strPath + strTodaysDate + "/" + txtBatchName.Text.Trim().Replace("&", "").Replace("%", "").Replace("/", "").Replace(@"\", "").Replace("*", "").Replace(":", "").Replace("?", "").Replace("<", "").Replace(">", "").Replace("|", "").Replace("é", "e") + "/"), strCustomerpath, strUser, strPwd, strClientpath + strTodaysDate + "/" + txtBatchName.Text.Trim().Replace("&", "").Replace("%", "").Replace("/", "").Replace(@"\", "").Replace("*", "").Replace(":", "").Replace("?", "").Replace("<", "").Replace(">", "").Replace("|", "") + "/", strClientUser, strClientPwd, strFileName, strConvFileName, gvCustomer.Rows[intLoop].Cells[4].Text, gvCustomer.Rows[intLoop].Cells[5].Text);
                    strInputPath = strInpPath + strTodaysDate + "/" + txtBatchName.Text.Trim().Replace("&", "").Replace("%", "").Replace("/", "").Replace(@"\", "").Replace("*", "").Replace(":", "").Replace("?", "").Replace("<", "").Replace(">", "").Replace("|", "").Replace("é", "e") + "/";
                }
                else
                {
                    strResult = RecursiveDownload((strPath + strTodaysDate + "/"), strCustomerpath, strUser, strPwd, strClientpath + strTodaysDate + "/", strClientUser, strClientPwd, strFileName, strConvFileName, gvCustomer.Rows[intLoop].Cells[4].Text, gvCustomer.Rows[intLoop].Cells[5].Text);
                    strInputPath = strInpPath + strTodaysDate + "/";
                }
              
                string status = string.Format("Step {0} - {1}", i,
strResult == "" ? "Successfully Transferred " + strFileName + " at " + DateTime.Now.ToString("HH:mm:ss") : "Failed " + strFileName + " - Due to {" + strResult.Replace("'", "") + "}");
                string status1 = "";
                if (txtBatchName.Text.Trim().Replace("&", "").Replace("%", "").Replace("/", "").Replace(@"\", "").Replace("*", "").Replace(":", "").Replace("?", "").Replace("<", "").Replace(">", "").Replace("|", "").Replace("'", "''").Replace("é", "e") != strTodaysDate.Replace(ddlSubClient.SelectedValue.Split('^')[0], ""))
                {
                    status1 = string.Format("Step {0} - {1}", i,
                        strResult == "" ? "Successfully Transferred " + strFileName + " From " + (strCustomerpath) + " To " + strPath + strTodaysDate + "/" + txtBatchName.Text.Trim().Replace("&", "").Replace("%", "").Replace("/", "").Replace(@"\", "").Replace("*", "").Replace(":", "").Replace("?", "").Replace("<", "").Replace(">", "").Replace("|", "").Replace("'", "''").Replace("é", "e") + "/" + " at " + DateTime.Now.ToString("HH:mm:ss") + " \n\r  \n\r" : "Failed " + strFileName + " - Due to {exception details}  \n\r  \n\r");
                }
                else
                {
                    status1 = string.Format("Step {0} - {1}", i,
                        strResult == "" ? "Successfully Transferred " + strFileName + " From " + (strCustomerpath) + " To " + strPath + strTodaysDate + "/" + " at " + DateTime.Now.ToString("HH:mm:ss") + " \n\r  \n\r" : "Failed " + strFileName + " - Due to {exception details}  \n\r  \n\r");
                }
                if (string.IsNullOrEmpty(this.LastStatus))
                    this.LastStatus = status;
                else
                    this.LastStatus = string.Format("{0}<br /><br />{1}", this.LastStatus, status);
                System.IO.StreamWriter file = new System.IO.StreamWriter(Server.MapPath("LogFilesForFileTransfer") + @"\FileTransferLog" + DateTime.Now.ToString("MM-dd-yyyy") + ".txt", true);
                file.WriteLine(status1);
                file.Close();
           

                Thread.Sleep(1000);

            }
        }
    }

    if (strResult == "")
    {
        strfinalstatus = "Successfully Transferred All The Files";
    }
    else
    {
        strfinalstatus = strResult;
    }
    this.Processing = false;
}   

protected string RecursiveDownload(string strPath, string strFtpPath, string strFtpUser, string strFtpPwd, string strSubClientFTPPath, string strSubClientFTPUser, string strSubClientFTPPwd, string strFileName, string strConvFileName, string strType, string strFileSize)
{
    string strResult = "";
    List<string> lstArray = new List<string>();

    if (strType != "" && strType != "&nbsp;")
    {
        strResult = TransferFile(strPath, strFtpPath, strFtpUser, strFtpPwd, strSubClientFTPPath, strSubClientFTPUser, strSubClientFTPPwd, strFileName, strConvFileName, strFileSize);
    }
    else
    {
      
        string strDirectoryInfo = fReturnDirectoryInfo1(strPath + strFileName, strFtpUser, strFtpPwd);
        string[] strSplit = strDirectoryInfo.Split('?');
        CreateFolder(strPath, strSubClientFTPPath, strSubClientFTPUser, strSubClientFTPPwd, strFileName);

        if (strDirectoryInfo != "")
        {
            for (int intLoop = 0; intLoop < strSplit.Length; intLoop++)
            {
                strResult = RecursiveDownload(strPath + strFileName + "/", strFtpPath + strFileName + "/", strFtpUser, strFtpPwd, strSubClientFTPPath + strFileName + "/", strSubClientFTPUser, strSubClientFTPPwd, strSplit[intLoop].Split(':')[1],
                    strSplit[intLoop].Split(':')[1], strSplit[intLoop].Split(':')[0], strFileSize);
            }
        }
    }
    return strResult;
}
 
protected string TransferFile(string strPath, string strFtpPath, string strFtpUser, string strFtpPwd, string strSubClientFTPPath, string strSubClientFTPUser, string strSubClientFTPPwd, string strFileName, string strConvFileName, string strFileSize)
{
    string strSuccess = "";
    FtpWebRequest reqFTP;
    try
    {
        if (File.Exists(strPath + strConvFileName))
        {
            Size = ((Math.Round(Convert.ToDouble(new FileInfo(strPath + strConvFileName).Length)) > 0 && Math.Round(Convert.ToDouble(new FileInfo(strPath + strConvFileName).Length)) < 1024) ? 1 : (Math.Round(Convert.ToDouble(new FileInfo(strPath + strConvFileName).Length) / 1024 + 0.0001)));
            strLocalFileSize = Size + "KB";
        }
        if (!File.Exists(strPath + strConvFileName) || strFileSize != strLocalFileSize)
        {
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpPath + strFileName.Replace("#", "%23")));
            System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
            reqFTP.EnableSsl = true;
            reqFTP.Timeout = Timeout.Infinite;
            reqFTP.KeepAlive = true;
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            //reqFTP.UseBinary = true;
            //reqFTP.UsePassive = false;
            reqFTP.Credentials = new NetworkCredential(strFtpUser, strFtpPwd);
          
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            Stream ftpStream = response.GetResponseStream();
            long cl = response.ContentLength;
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[bufferSize];
          
            readCount = ftpStream.Read(buffer, 0, bufferSize);
           
            FileStream outputStream = new FileStream(strPath +
                                                     strConvFileName, FileMode.Create);
            while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
            }

            ftpStream.Close();
            outputStream.Close();
            response.Close();
            strSuccess = "";
     
        }
        else
        {
            strSuccess = "File Exists";
        }
    }
    catch (Exception ex)
    {
        strSuccess = ex.Message;
      
    }
    return strSuccess;
}

我还尝试了 PASSIVE 和 SSL 等的不同设置。但是,我还是明白了。

注意:- FTP 客户端在此之后更改其端口,我收到此错误。所以这是客户端的一部分,还是我必须更改代码中的任何内容?

希望您理解我的问题,如果您正在阅读我的问题并且无法理解,请通过评论回复与我联系。

使用WebRequest 的输出日志如下。这适用于 3 个文件,其中第一个和第二个文件传输但第三个文件出错。

[Subject]
  CN=*.h************d.net, OU=Domain Control Validated
  Simple Name: *.h************d.net
  DNS Name: h************d.net

[Issuer]
  CN=Go Daddy Secure Certificate Authority - G2, OU=http://certs.godaddy.com/repository/, O="GoDaddy.com, Inc.", L=Scottsdale, S=Arizona, C=US
  Simple Name: Go Daddy Secure Certificate Authority - G2
  DNS Name: Go Daddy Secure Certificate Authority - G2

[Serial Number]
  00***********CF

[Not Before]
  06/23/2019 11:20:31 PM

[Not After]
  06/23/2021 5:48:21 AM

[Thumbprint]
  043**************31991F8A

[Signature Algorithm]
  sha256RSA(1.2.840.113549.1.1.11)

[Public Key]
  Algorithm: RSA
  Length: 2048
  Key Blob: 30 82 01 0a 02 82 01 01 00 b3 08 29 d4 49 ab a0 ce 70 cd b2 72 1e 99 50 2f 63 9a 8c 95 8e c5 54 7b 66 bc 37 c3 81 b6 38 cb a8 aa f5 bc 95 99 94 2a de 11 73 5b b3 ed 00 ad dd 39 0b e1 52 b2 80 82 61 3c e5 37 15 92 f2 f8 6a fa ef 05 98 e2 f5 33 35 0d 09 0f 1d 14 1a a9 c8 e7 cd 04 87 a1 67 1....
System.Net Information: 0 : [12876] SecureChannel#29899600 - Remote certificate has errors:
System.Net Information: 0 : [12876] SecureChannel#29899600 -    Certificate name mismatch.
System.Net Information: 0 : [12876] SecureChannel#29899600 - Remote certificate was verified as valid by the user.
System.Net Information: 0 : [12876] ProcessAuthentication(Protocol=Tls, Cipher=Aes256 256 bit strength, Hash=Sha1 160 bit strength, Key Exchange=44550 256 bit strength).
System.Net Error: 0 : [12876] Decrypt failed with error 0X90317.
System.Net Information: 0 : [12876] FtpControlStream#35723434 - Received response [226 Successfully transferred "/RECORDS REVIEW/FROM TRANSCRIBER/2019/10 October 2019/10-09-19"]
System.Net Information: 0 : [12876] FtpWebRequest#29959295::(Releasing FTP connection#35723434.)
System.Net Information: 0 : [6012] ServicePoint#37369992 - Closed as idle.
System.Net Information: 0 : [1608] FtpWebRequest#9486968::.ctor(ftp://7*.***.***.***:11121/RECORDS REVIEW/FROM TRANSCRIBER/2019/10 October 2019/10-09-19/INVOICE %23 HP-ROR7506(********) ********, ******** 09-26-19 MED REC KIM ********.doc)
System.Net Information: 0 : [1608] FtpWebRequest#9486968::GetResponse(Method=RETR.)
System.Net Information: 0 : [1608] Associating FtpWebRequest#9486968 with FtpControlStream#34452536
System.Net Information: 0 : [1608] FtpControlStream#34452536 - Sending command [PASV]
System.Net Information: 0 : [1608] FtpControlStream#34452536 - Received response [227 Entering Passive Mode (7*,***,***,***,205,37)]
System.Net Information: 0 : [1608] FtpControlStream#34452536 - Sending command [RETR RECORDS REVIEW/FROM TRANSCRIBER/2019/10 October 2019/10-09-19/INVOICE # HP-ROR7506(********) ********, ******** 09-26-19 MED REC KIM ********.doc]
System.Net Information: 0 : [1608] FtpControlStream#34452536 - Received response [150 Opening data channel for file download from server of "/RECORDS REVIEW/FROM TRANSCRIBER/2019/10 October 2019/10-09-19/INVOICE # HP-ROR7506(********) ********, ******** 09-26-19 MED REC KIM ********.doc"]
System.Net Information: 0 : [1608] TlsStream#38212950::.ctor(host=7*.***.***.***, #certs=0, checkCertificateRevocationList=False, sslProtocols=Default)
System.Net Information: 0 : [1608] SecureChannel#52936877::.ctor(hostname=7*.***.***.***, #clientCertificates=0, encryptionPolicy=RequireEncryption)
System.Net Information: 0 : [1608] SecureChannel#52936877 - Left with 0 client certificates to choose from.
System.Net Information: 0 : [1608] Using the cached credential handle.
System.Net Information: 0 : [1608] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = (null), targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1608] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=135, returned code=ContinueNeeded).
System.Net Information: 0 : [1608] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 81e3228:b56e008, targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1608] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [1608] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 81e3228:b56e008, targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1608] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [1608] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 81e3228:b56e008, targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1608] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [1608] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 81e3228:b56e008, targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1608] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=134, returned code=ContinueNeeded).
System.Net Information: 0 : [1608] FtpWebRequest#9486968::(Releasing FTP connection#34452536.)
System.Net Error: 0 : [1608] Exception in FtpWebRequest#9486968::GetResponse - The remote server returned an error: 150 Opening data channel for file download from server of "/RECORDS REVIEW/FROM TRANSCRIBER/2019/10 October 2019/10-09-19/INVOICE # HP-ROR7506(********) ********, ******** 09-26-19 MED REC KIM ********.doc"
..
   at System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
   at System.Net.FtpWebRequest.RequestCallback(Object obj)
   at System.Net.CommandStream.Dispose(Boolean disposing)
   at System.IO.Stream.Close()
   at System.IO.Stream.Dispose()
   at System.Net.ConnectionPool.Destroy(PooledStream pooledStream)
   at System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32 creationTimeout, Boolean canReuse)
   at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
   at System.Net.FtpWebRequest.GetResponse()
System.Net Information: 0 : [1608] FtpWebRequest#55445276::.ctor(ftp://7*.***.***.***:11121/RECORDS REVIEW/FROM TRANSCRIBER/2019/10 October 2019/10-09-19/INVOICE %23 HP-ROR7507(********) ********.doc)
System.Net Information: 0 : [1608] FtpWebRequest#55445276::GetResponse(Method=RETR.)
System.Net Information: 0 : [1608] Associating FtpWebRequest#55445276 with FtpControlStream#35723434
System.Net Information: 0 : [1608] FtpControlStream#35723434 - Sending command [CWD /]
System.Net Information: 0 : [1988] FtpWebRequest#23551555::.ctor(ftp://7*.***.***.***:11121/RECORDS REVIEW/FROM TRANSCRIBER/2019/10 October 2019/10-09-19/)
System.Net Information: 0 : [1988] FtpWebRequest#23551555::GetResponse(Method=LIST.)
System.Net Information: 0 : [1608] FtpControlStream#35723434 - Received response [250 CWD successful. "/" is current directory.]
System.Net Information: 0 : [1608] FtpControlStream#35723434 - Sending command [PASV]
System.Net Information: 0 : [1988] FtpControlStream#15713638 - Created connection from 10.200.10.35:56838 to 7*.***.***.***:11121.
System.Net Information: 0 : [1988] Associating FtpWebRequest#23551555 with FtpControlStream#15713638
System.Net Information: 0 : [1608] FtpControlStream#35723434 - Received response [227 Entering Passive Mode (7*,***,***,***,205,62)]
System.Net Information: 0 : [1988] FtpControlStream#15713638 - Received response [220-FileZilla Server 0.9.60 beta
220-written by Tim Kosse (Tim.Kosse@gmx.de)
220 Please visit https://filezilla-project.org/]
System.Net Information: 0 : [1988] FtpControlStream#15713638 - Sending command [AUTH TLS]
System.Net Information: 0 : [1608] FtpControlStream#35723434 - Sending command [RETR RECORDS REVIEW/FROM TRANSCRIBER/2019/10 October 2019/10-09-19/INVOICE # HP-ROR7507(********) ********.doc]
System.Net Information: 0 : [1988] FtpControlStream#15713638 - Received response [234 Using authentication type TLS]
System.Net Information: 0 : [1988] TlsStream#56336575::.ctor(host=7*.***.***.***, #certs=0, checkCertificateRevocationList=False, sslProtocols=Default)
System.Net Information: 0 : [1988] FtpControlStream#15713638 - Sending command [USER ********]
System.Net Information: 0 : [1988] SecureChannel#47899302::.ctor(hostname=7*.***.***.***, #clientCertificates=0, encryptionPolicy=RequireEncryption)
System.Net Information: 0 : [1988] SecureChannel#47899302 - Left with 0 client certificates to choose from.
System.Net Information: 0 : [1988] Using the cached credential handle.
System.Net Information: 0 : [1988] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = (null), targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1988] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=103, returned code=ContinueNeeded).
System.Net Information: 0 : [1988] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 81e3228:b4d7158, targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1988] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [1988] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 81e3228:b4d7158, targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1988] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [1988] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 81e3228:b4d7158, targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1988] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [1988] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 81e3228:b4d7158, targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1988] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=134, returned code=ContinueNeeded).
System.Net Information: 0 : [1608] FtpControlStream#35723434 - Received response [150 Opening data channel for file download from server of "/RECORDS REVIEW/FROM TRANSCRIBER/2019/10 October 2019/10-09-19/INVOICE # HP-ROR7507(********) ********.doc"]
System.Net Information: 0 : [1608] TlsStream#50391717::.ctor(host=7*.***.***.***, #certs=0, checkCertificateRevocationList=False, sslProtocols=Default)
System.Net Information: 0 : [1608] SecureChannel#56638896::.ctor(hostname=7*.***.***.***, #clientCertificates=0, encryptionPolicy=RequireEncryption)
System.Net Information: 0 : [1608] SecureChannel#56638896 - Left with 0 client certificates to choose from.
System.Net Information: 0 : [1608] Using the cached credential handle.
System.Net Information: 0 : [1608] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = (null), targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1608] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=103, returned code=ContinueNeeded).
System.Net Information: 0 : [1988] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 81e3228:b4d7158, targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1988] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [1988] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 81e3228:b4d7158, targetName = 7*.***.***.***, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [1988] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=OK).
System.Net Information: 0 : [1988] Remote certificate: [Version]
  V3

【问题讨论】:

    标签: c# asp.net ftp ftp-client ftpwebrequest


    【解决方案1】:

    我不能 100% 确定这是否相关,但是 ...

    我们遇到了完全相同的问题,经过多年的正常工作,它昨天才开始,客户端我们从服务器收到与您相同的 FTP '150' 响应,但如果我们检查服务器日志,情况会更严重上,我们得到:

    450 数据连接的 TLS 会话未恢复或会话与控制连接不匹配

    由于这是一个最近出现的问题,并且仅针对我们的少数客户,我们已设法将潜在问题缩小到 3 个 Windows 更新,但我不确定它们发生了什么变化:

    • 2019 年 10 月 Internet Explorer 11 累积安全更新 (KB4519974)
    • 2019 年 10 月安全质量月度汇总 (KB4520005)
    • 2019 年 10 月仅安全质量更新 (KB4519990)

    我们的一位客户回滚了这些更新,我们的软件又开始为他们正常工作。

    由于我们不能指望我们的客户回滚安全更新,因此我们目前使用的解决方法是关闭“使用 PROT P 时需要在数据连接上恢复 TLS 会话” 设置服务器,但这会带来安全隐患,因此不是一个可靠的解决方案。

    我个人怀疑其中一个更新搞砸了 FtpWebRequest 类的工作方式,它可能不再处理 TLS 会话恢复本身。

    根据我在互联网上阅读的内容,我拼命寻找与大多数商业 FTP 客户端相关的内容,这些客户端基于 FtpWebRequest 类构建并自行处理 TLS 会话恢复。

    【讨论】:

      【解决方案2】:

      正如@Davis 的回答已经说过的那样,可能的罪魁祸首是 .NET 框架中缺乏 TLS/SSL 会话重用支持。如果您的服务器需要它,您不能使用 FtpWebRequest/WebClient 或任何其他使用 .NET 实现 TLS/SSL 的库(例如 FluentFTP)。

      您必须使用使用自己的 TLS/SSL 实现的 FTP 库。

      相关问题:Can connect to FTP using FileZilla or WinSCP, but not with FtpWebRequest or FluentFTP – 它包含一些文章的链接,这些文章表明 .NET 框架之前支持 TLS/SSL 重用但已被删除。

      【讨论】:

        猜你喜欢
        • 2020-01-11
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-30
        相关资源
        最近更新 更多