Suddenly getting “150 Opening Data channel for file download from server” after the FTP downloads was working for years

谁都会走 提交于 2021-02-07 04:28:49

问题


I make the file transfer application using ASP.NET with C# in which I transfer the files from the FTP location to my server location. This is working fine from last 5 years, but after that now I am getting below error.

The remote server returned an error: 150 Opening data channel for file download from the server

And code which I am using is below

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

I also tried the different settings of PASSIVE and SSL and others. But still, I am getting this.

NOTE:- the FTP client change their PORT after this I am getting this error. So this is part of client side or I have to change anything in my code?

Hope you understand my problem, if you are reading my problem and can't understand please feel to contact me by reply on comment.

Output log using WebRequest are below. This is for 3 files in which first and second files transferred but third file gives error.

[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

回答1:


I'm not 100% sure if this is related but ...

We are having the exact same issue and it just started yesterday after years of working fine, client side we get the same FTP '150' response as you from the server, but if we check the server logs something more serious is going on, we get:

450 TLS session of data connection has not resumed or the session does not match the control connection

As this is a very recent issue and is isolated to only a few of our clients, we have managed to narrow down the potential issue to 3 windows updates, but I'm not sure what they have changed:

  • 2019-10 Cumulative Security Update for Internet explorer 11 (KB4519974)
  • 2019-10 Security Monthly Quality Rollup (KB4520005)
  • 2019-10 Security Only Quality Update (KB4519990)

One of our customers rolled back the these updates and our software started working fine again for them.

As we cannot expect our customers to roll back security updates, the current workaround we are using for this is to turn off the "Require TLS session resumption on data connection when using PROT P" setting on the server, but this has security implications attached to it so is not a solid solution going forward.

I personally suspect one of the updates have screwed the way the FtpWebRequest class works and maybe it not longer handles TLS session resumption itself.

From what I have read around the internet desperately searching for something related to this most commercial FTP clients build upon the FtpWebRequest Class and handle TLS session resumption themselves.




回答2:


As @Davis's answer already says, the possible culprit is the lack of TLS/SSL session reuse support in the .NET framework. If your server requires it, you cannot use FtpWebRequest/WebClient nor any other library that uses .NET implementation of TLS/SSL (such as FluentFTP).

You will have to use an FTP library that uses own TLS/SSL implementation.

Related question: Can connect to FTP using FileZilla or WinSCP, but not with FtpWebRequest or FluentFTP – It includes links to articles that suggest that .NET framework was supporting TLS/SSL reuse earlier but it was removed.



来源:https://stackoverflow.com/questions/58297792/suddenly-getting-150-opening-data-channel-for-file-download-from-server-after

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!