3

「リモートサーバーがエラーを返しました:(530)ログインしていません。」というエラーが表示されます。FtpWebRequestを使用してファイルをアップロードしている間。

  1. エラーは、サブフォルダーを持つパスにファイルを転送した場合にのみ発生します。それ以外の場合は、完全に正常に機能します。
  2. 約5〜10 MBの大きなファイルをアップロードすると、タイムアウトになります。

    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();
        }
    
4

2 に答える 2

0

標準の FTP クライアントを介して同じ操作を試みたことがあると思います。そうでない場合は、それを試してください。次に、Wireshark を使用して、それがサーバーからの応答であることを確認し、資格情報が送信されていることを確認します。それが確認されたら、FTP 所有者に確認し、サーバーが適切に構成されていることを確認します。

于 2013-01-11T14:17:13.727 に答える
-2

あなたの問題の解決策が正確にはわかりません。しかし、いくつかの提案:

可能な限りクラスで使用using(...)してください。IDisposableこれにより、終了時に適切なリソースの解放とクリーンアップが促進されます。MSDN: 使用

ミリ秒のタイムアウトを使用し6000ます。大きなファイルの場合はタイムアウトを増やすか、ローカル変数を使用する必要がありますtimeout(アプリの設定から読み取る)。

改善されたコード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);

                }
            }

        }
于 2013-01-11T14:29:24.213 に答える