vasanthkumar
vasanthkumar

Reputation: 144

FtpWebRequest returns "The remote server returned an error: (530) Not logged in"

I get this error "The remote server returned an error: (530) Not logged in." while uploading the file using FtpWebRequest.

  1. Error occurs only when I transfer the files to path having subfolders, otherwise it perfectly works fine.
  2. Uploading large files about 5 to 10 MB, it gets timed out.

    void FtpTransfer(string siteName, string portNumber, string ftpUser, string ftpPassword, string destPath)
    {
        FtpWebRequest request;
        DateTime now = DateTime.Now;
        string now_string =
            (now.Year).ToString()
            + "_" +
            (now.Month).ToString("0#")
            + "_" +
            (now.Day).ToString("0#");
    
        foreach (object item in listBox1.Items)
        {
            string srcFile = item.ToString();
            lblSource.Text = srcFile;
            Uri uri = new Uri(srcFile);
            string destFile = srcFile.Replace(lblPath.Text, "").Replace("\\\\", "\\").Replace("\\", "/").Replace("www/","");
    
            Configuration oConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            int timeout = int.Parse(oConfig.AppSettings.Settings["TimeOut"].Value);
    
            if (siteName == "mysite1.co.in" || siteName == "sd1.mysite2.net")
                destFile = "ftp://" + siteName + ":" + portNumber + "/" + siteName + "/_test" + destFile; //error here
            else
                destFile = "ftp://" + siteName + ":" + portNumber + "/" + siteName + destFile; //no error
            lblDestn.Text = destFile;
    
            request = (FtpWebRequest)WebRequest.Create(destFile);
            request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
            request.Timeout = 6000;
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.UsePassive = true;
            request.UseBinary = true;
            request.KeepAlive = true;
    
            // Copy the contents of the file to the request stream.
            StreamReader sourceStream = new StreamReader(@srcFile);
            byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
            sourceStream.Close();
            request.ContentLength = fileContents.Length;
    
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            requestStream.Close();
    
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    
            string path = System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
            System.IO.StreamWriter w = System.IO.File.AppendText(path + "\\log_" + now_string + ".txt");
            w.WriteLine(DateTime.Now.ToString("yyy-MM-dd HH:mm:ss")
                + " "
                + srcFile
                + " "
                + destFile
                + " "
                + response.StatusDescription);
    
            w.Close();
    
            response.Close();
        }
    

Upvotes: 3

Views: 8508

Answers (2)

CodeTherapist
CodeTherapist

Reputation: 2806

I do not exactly know the solution for your problem. but some suggestions:

Use using(...) on IDisposable classes when ever possible. This promotes proper resource releasing and cleanup when you are finished with it. MSDN: Using

You use a timeout of 6000 miliseconds, may you should increase it for huge files or use your local variable timeout (read from you app settings).

Improved code with using:

private void FtpTransfer(string siteName, string portNumber, string ftpUser, string ftpPassword, string destPath)
        {
            DateTime now = DateTime.Now;
            string now_string =
                (now.Year).ToString()
                + "_" +
                (now.Month).ToString("0#")
                + "_" +
                (now.Day).ToString("0#");

            foreach (object item in listBox1.Items)
            {
                string srcFile = item.ToString();
                lblSource.Text = srcFile;
                Uri uri = new Uri(srcFile);
                string destFile = srcFile.Replace(lblPath.Text, "").Replace("\\\\", "\\").Replace("\\", "/").Replace("www/", "");

                Configuration oConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                int timeout = int.Parse(oConfig.AppSettings.Settings["TimeOut"].Value);

                if (siteName == "mysite1.co.in" || siteName == "sd1.mysite2.net")
                    destFile = "ftp://" + siteName + ":" + portNumber + "/" + siteName + "/_test" + destFile; //error here
                else
                    destFile = "ftp://" + siteName + ":" + portNumber + "/" + siteName + destFile; //no error
                lblDestn.Text = destFile;

                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(destFile);
                request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
                request.Timeout = 6000;
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.UsePassive = true;
                request.UseBinary = true;
                request.KeepAlive = true;

                // Copy the contents of the file to the request stream.
                byte[] fileContents;
                using (StreamReader sourceStream = new StreamReader(@srcFile))
                {
                    fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
                }
                request.ContentLength = fileContents.Length;

                using (Stream requestStream = request.GetRequestStream())
                {
                    requestStream.Write(fileContents, 0, fileContents.Length);
                }

                using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
                {
                    string path = System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
                    System.IO.StreamWriter w = System.IO.File.AppendText(path + "\\log_" + now_string + ".txt");
                    w.WriteLine(DateTime.Now.ToString("yyy-MM-dd HH:mm:ss")
                                + " "
                                + srcFile
                                + " "
                                + destFile
                                + " "
                                + response.StatusDescription);

                }
            }

        }

Upvotes: -2

Brian P
Brian P

Reputation: 1587

I am assuming that you have already attempted to do the same operation through a standard FTP client. If not, try that. I would then use Wireshark to make sure that is the response coming from the server and verify that the credentails are being sent. After that is verified, check with the FTP owner and make sure the server is configured appropriately.

Upvotes: 0

Related Questions