Как использовать пассивный режим в FtpWebRequest и исправить ошибку PASV в.Net 3.5 и определить диапазон портов по кодам

Пожалуйста, сначала посмотрите мои коды окон:

        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Linq;
        using System.Text;
        using System.Windows.Forms;

        namespace my_prog
        {
            public partial class Form1 : Form
            {
                public Form1()
                {
                    InitializeComponent();
                }
                string ftp_username = "goodzilla_user";
                string ftp_password = "goodzilla_pass";
                string ftp_remote_host = @"ftp://11.11.111.11";

                private void Form1_Load(object sender, EventArgs e)
                {
                    UploadFile("d:\\test.txt", ftp_remote_host + @"/test.txt", ftp_username, ftp_password);
                }

                #region UploadFile Method

                /// <summary>
                /// Methods to upload file to FTP Server
                /// </summary>
                /// <param name="_FileName">local source file name</param>
                /// <param name="_UploadPath">Upload FTP path including Host name</param>
                /// <param name="_FTPUser">FTP login username</param>
                /// <param name="_FTPPass">FTP login password</param>
                /// 
                public void UploadFile(string _FileName, string _UploadPath, string _FTPUser, string _FTPPass)
                {
                    System.IO.FileInfo _FileInfo = new System.IO.FileInfo(_FileName);

                    // Create FtpWebRequest object from the Uri provided
                    System.Net.FtpWebRequest _FtpWebRequest = (System.Net.FtpWebRequest)System.Net.FtpWebRequest.Create(new Uri(_UploadPath));

                    // Provide the WebPermission Credintials
                    _FtpWebRequest.Credentials = new System.Net.NetworkCredential(_FTPUser, _FTPPass);

                    // By default KeepAlive is true, where the control connection is not closed
                    // after a command is executed.
                    _FtpWebRequest.KeepAlive = false;

                    // set timeout for 20 seconds
                    _FtpWebRequest.Timeout = 20000;

                    // Specify the command to be executed.
                    _FtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile;

                    // Specify the data transfer type.
                    _FtpWebRequest.UseBinary = true;

                    // Notify the server about the size of the uploaded file
                    _FtpWebRequest.ContentLength = _FileInfo.Length;

                    // The buffer size is set to 2kb
                    int buffLength = 2048;
                    byte[] buff = new byte[buffLength];

                    // Opens a file stream (System.IO.FileStream) to read the file to be uploaded
                    System.IO.FileStream _FileStream = _FileInfo.OpenRead();

                    try
                    {
                        // Stream to which the file to be upload is written
                        System.IO.Stream _Stream = _FtpWebRequest.GetRequestStream();

                        // Read from the file stream 2kb at a time
                        int contentLen = _FileStream.Read(buff, 0, buffLength);

                        // Till Stream content ends
                        while (contentLen != 0)
                        {
                            // Write Content from the file stream to the FTP Upload Stream
                            _Stream.Write(buff, 0, contentLen);
                            contentLen = _FileStream.Read(buff, 0, buffLength);
                        }

                        // Close the file stream and the Request Stream
                        _Stream.Close();
                        _Stream.Dispose();
                        _FileStream.Close();
                        _FileStream.Dispose();

                        MessageBox.Show("Done");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Upload Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }

                #endregion

            }
        }

Я использую метод UploadFile для загрузки моих данных на мой сервер Windows Server 2008 R2.
эти коды в .net 4 работают идеально, и моя проблема о .net 3.5.
в .net 3.5 я получил эту ошибку:

"Сервер возвратил адрес в ответ на команду PASV, который отличается от адреса, с которым было установлено FTP-соединение".

по нижеприведенным причинам я не хочу использовать active mode:

  1. как вы знаете, пассивный режим лучше, чем активный режим для подключения...

  2. Когда я использую активный режим в.net 3.5 и включаю Proxy Software, я получаю ошибку ниже:

"Базовое соединение было закрыто: сервер совершил нарушение протокола".

но .net 4 не имеет проблем с этим Proxy Software и пассивным режимом, и я не могу переключиться на .net 4 из-за моих пользователей...
так как я могу исправить ошибку пассивного режима в .net 3.5?
в каждом потоке в стеке люди говорят просто:

    _FtpWebRequest.UsePassive = false;    

и это не мой ответ!

Примечание. Брандмауэр на сервере и на сервере отключен.


ДРУГОЙ ВОПРОС:

Можно ли определить диапазон портов в режиме pssive с помощью кодов?
Я задал этот вопрос в этой теме, потому что я подумал, что мы можем исправить эту ошибку PASV и помочь пассивному режиму быстрее выполнить свою работу...



РЕДАКТИРОВАТЬ:
я нашел ветку ниже, и я думаю, что у меня есть ситуация в ответе № 2,
FTP-проблема
У меня есть два сетевых адаптера на моем сервере, и IP-адрес каждого из них внутри сервера, как 192.168.5.?? & 192.168.5.??
но мои два публичных IP-адреса разные.
так как я могу исправить эту ошибку, изменив что-то в моих кодах или в моем Windows Server 2008-R2 VPS и почему эта ошибка появляется только в.net 3.5, а в.net 4 у нас ее нет?
Я имею полный доступ к своему серверу и могу изменить все, что необходимо.

заранее спасибо

1 ответ

Решение

Вот ваш ответ:
кажется, что проблема не имеет ничего общего с .net 3.5 и .net 4
Вы можете решить эту проблему внутри сервера, как показано ниже
конфигурированию-FTP-брандмауэр-настройки-в-МИС-7
для ошибки программного обеспечения прокси: измените диапазоны портов.
для пассивной ошибки: измените Внешний IP-адрес брандмауэра на ваш публичный IP-адрес.

IMG

РЕДАКТИРОВАТЬ:
было бы очень полезно, чтобы другие узнали о нас, возможно ли определить диапазоны портов в коде или нет?

Другие вопросы по тегам