Поделиться через


FtpWebRequest Класс

Определение

Реализует FTP-клиент.

public ref class FtpWebRequest sealed : System::Net::WebRequest
public sealed class FtpWebRequest : System.Net.WebRequest
type FtpWebRequest = class
    inherit WebRequest
Public NotInheritable Class FtpWebRequest
Inherits WebRequest
Наследование

Примеры

В следующем примере кода показано удаление файла с FTP-сервера.

static bool DeleteFileOnServer( Uri^ serverUri )
{
   // The serverUri parameter should use the ftp:// scheme.
   // It contains the name of the server file that is to be deleted.
   // Example: ftp://contoso.com/someFile.txt.
   // 
   if ( serverUri->Scheme != Uri::UriSchemeFtp )
   {
      return false;
   }

   // Get the object used to communicate with the server.
   FtpWebRequest^ request = dynamic_cast<FtpWebRequest^>(WebRequest::Create( serverUri ));
   request->Method = WebRequestMethods::Ftp::DeleteFile;
   FtpWebResponse^ response = dynamic_cast<FtpWebResponse^>(request->GetResponse());
   Console::WriteLine( "Delete status: {0}", response->StatusDescription );
   response->Close();
   return true;
}
public static bool DeleteFileOnServer(Uri serverUri)
{
    // The serverUri parameter should use the ftp:// scheme.
    // It contains the name of the server file that is to be deleted.
    // Example: ftp://contoso.com/someFile.txt.
    //

    if (serverUri.Scheme != Uri.UriSchemeFtp)
    {
        return false;
    }
    // Get the object used to communicate with the server.
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
    request.Method = WebRequestMethods.Ftp.DeleteFile;

    FtpWebResponse response = (FtpWebResponse) request.GetResponse();
    Console.WriteLine("Delete status: {0}",response.StatusDescription);
    response.Close();
    return true;
}

В следующем примере кода демонстрируется скачивание файла с FTP-сервера с помощью WebClient класса .

static bool DisplayFileFromServer( Uri^ serverUri )
{
   // The serverUri parameter should start with the ftp:// scheme.
   if ( serverUri->Scheme != Uri::UriSchemeFtp )
   {
      return false;
   }

   // Get the object used to communicate with the server.
   WebClient^ request = gcnew WebClient;

   // This example assumes the FTP site uses anonymous logon.
   request->Credentials = gcnew NetworkCredential( "anonymous","[email protected]" );
   try
   {
      array<Byte>^newFileData = request->DownloadData( serverUri->ToString() );
      String^ fileString = System::Text::Encoding::UTF8->GetString( newFileData );
      Console::WriteLine( fileString );
   }
   catch ( WebException^ e ) 
   {
      Console::WriteLine( e );
   }

   return true;
}
public static bool DisplayFileFromServer(Uri serverUri)
{
    // The serverUri parameter should start with the ftp:// scheme.
    if (serverUri.Scheme != Uri.UriSchemeFtp)
    {
        return false;
    }
    // Get the object used to communicate with the server.
    WebClient request = new WebClient();

    // This example assumes the FTP site uses anonymous logon.
    request.Credentials = new NetworkCredential ("anonymous","[email protected]");
    try
    {
        byte [] newFileData = request.DownloadData (serverUri.ToString());
        string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
        Console.WriteLine(fileString);
    }
    catch (WebException e)
    {
        Console.WriteLine(e.ToString());
    }
    return true;
}

В следующем примере кода демонстрируется использование асинхронных операций для отправки файла на FTP-сервер.

#using <System.dll>

using namespace System;
using namespace System::Net;
using namespace System::Threading;
using namespace System::IO;

public ref class FtpState
{
private:
   ManualResetEvent^ wait;
   FtpWebRequest^ request;
   String^ fileName;
   Exception^ operationException;
   String^ status;

public:
   FtpState()
   {
      wait = gcnew ManualResetEvent( false );
   }

   property ManualResetEvent^ OperationComplete 
   {
      ManualResetEvent^ get()
      {
         return wait;
      }

   }

   property FtpWebRequest^ Request 
   {
      FtpWebRequest^ get()
      {
         return request;
      }

      void set( FtpWebRequest^ value )
      {
         request = value;
      }

   }

   property String^ FileName 
   {
      String^ get()
      {
         return fileName;
      }

      void set( String^ value )
      {
         fileName = value;
      }

   }

   property Exception^ OperationException 
   {
      Exception^ get()
      {
         return operationException;
      }

      void set( Exception^ value )
      {
         operationException = value;
      }

   }

   property String^ StatusDescription 
   {
      String^ get()
      {
         return status;
      }

      void set( String^ value )
      {
         status = value;
      }

   }
};

public ref class AsynchronousFtpUpLoader
{
public:

   // Command line arguments are two strings:
   // 1. The url that is the name of the file being uploaded to the server.
   // 2. The name of the file on the local machine.
   //
   static void Main()
   {
      array<String^>^args = Environment::GetCommandLineArgs();

      // Create a Uri instance with the specified URI string.
      // If the URI is not correctly formed, the Uri constructor
      // will throw an exception.
      ManualResetEvent^ waitObject;
      Uri^ target = gcnew Uri( args[ 1 ] );
      String^ fileName = args[ 2 ];
      FtpState^ state = gcnew FtpState;
      FtpWebRequest ^ request = dynamic_cast<FtpWebRequest^>(WebRequest::Create( target ));
      request->Method = WebRequestMethods::Ftp::UploadFile;

      // This example uses anonymous logon.
      // The request is anonymous by default; the credential does not have to be specified. 
      // The example specifies the credential only to
      // control how actions are logged on the server.
      request->Credentials = gcnew NetworkCredential( "anonymous","[email protected]" );

      // Store the request in the object that we pass into the
      // asynchronous operations.
      state->Request = request;
      state->FileName = fileName;

      // Get the event to wait on.
      waitObject = state->OperationComplete;

      // Asynchronously get the stream for the file contents.
      request->BeginGetRequestStream( gcnew AsyncCallback( EndGetStreamCallback ), state );

      // Block the current thread until all operations are complete.
      waitObject->WaitOne();

      // The operations either completed or threw an exception.
      if ( state->OperationException != nullptr )
      {
         throw state->OperationException;
      }
      else
      {
         Console::WriteLine( "The operation completed - {0}", state->StatusDescription );
      }
   }

private:
   static void EndGetStreamCallback( IAsyncResult^ ar )
   {
      FtpState^ state = dynamic_cast<FtpState^>(ar->AsyncState);
      Stream^ requestStream = nullptr;

      // End the asynchronous call to get the request stream.
      try
      {
         requestStream = state->Request->EndGetRequestStream( ar );

         // Copy the file contents to the request stream.
         const int bufferLength = 2048;
         array<Byte>^buffer = gcnew array<Byte>(bufferLength);
         int count = 0;
         int readBytes = 0;
         FileStream^ stream = File::OpenRead( state->FileName );
         do
         {
            readBytes = stream->Read( buffer, 0, bufferLength );
            requestStream->Write( buffer, 0, bufferLength );
            count += readBytes;
         }
         while ( readBytes != 0 );
         Console::WriteLine( "Writing {0} bytes to the stream.", count );

         // IMPORTANT: Close the request stream before sending the request.
         requestStream->Close();

         // Asynchronously get the response to the upload request.
         state->Request->BeginGetResponse( gcnew AsyncCallback( EndGetResponseCallback ), state );
      }
      // Return exceptions to the main application thread.
      catch ( Exception^ e ) 
      {
         Console::WriteLine( "Could not get the request stream." );
         state->OperationException = e;
         state->OperationComplete->Set();
         return;
      }
   }

   // The EndGetResponseCallback method  
   // completes a call to BeginGetResponse.
   static void EndGetResponseCallback( IAsyncResult^ ar )
   {
      FtpState^ state = dynamic_cast<FtpState^>(ar->AsyncState);
      FtpWebResponse ^ response = nullptr;
      try
      {
         response = dynamic_cast<FtpWebResponse^>(state->Request->EndGetResponse( ar ));
         response->Close();
         state->StatusDescription = response->StatusDescription;

         // Signal the main application thread that 
         // the operation is complete.
         state->OperationComplete->Set();
      }
      // Return exceptions to the main application thread.
      catch ( Exception^ e ) 
      {
         Console::WriteLine( "Error getting response." );
         state->OperationException = e;
         state->OperationComplete->Set();
      }
   }
};

int main()
{
   AsynchronousFtpUpLoader::Main();
}
using System;
using System.Net;
using System.Threading;

using System.IO;
namespace Examples.System.Net
{
    public class FtpState
    {
        private ManualResetEvent wait;
        private FtpWebRequest request;
        private string fileName;
        private Exception operationException = null;
        string status;

        public FtpState()
        {
            wait = new ManualResetEvent(false);
        }

        public ManualResetEvent OperationComplete
        {
            get {return wait;}
        }

        public FtpWebRequest Request
        {
            get {return request;}
            set {request = value;}
        }

        public string FileName
        {
            get {return fileName;}
            set {fileName = value;}
        }
        public Exception OperationException
        {
            get {return operationException;}
            set {operationException = value;}
        }
        public string StatusDescription
        {
            get {return status;}
            set {status = value;}
        }
    }
    public class AsynchronousFtpUpLoader
    {
        // Command line arguments are two strings:
        // 1. The url that is the name of the file being uploaded to the server.
        // 2. The name of the file on the local machine.
        //
        public static void Main(string[] args)
        {
            // Create a Uri instance with the specified URI string.
            // If the URI is not correctly formed, the Uri constructor
            // will throw an exception.
            ManualResetEvent waitObject;

            Uri target = new Uri (args[0]);
            string fileName = args[1];
            FtpState state = new FtpState();
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(target);
            request.Method = WebRequestMethods.Ftp.UploadFile;

            // This example uses anonymous logon.
            // The request is anonymous by default; the credential does not have to be specified.
            // The example specifies the credential only to
            // control how actions are logged on the server.

            request.Credentials = new NetworkCredential ("anonymous","[email protected]");

            // Store the request in the object that we pass into the
            // asynchronous operations.
            state.Request = request;
            state.FileName = fileName;

            // Get the event to wait on.
            waitObject = state.OperationComplete;

            // Asynchronously get the stream for the file contents.
            request.BeginGetRequestStream(
                new AsyncCallback (EndGetStreamCallback),
                state
            );

            // Block the current thread until all operations are complete.
            waitObject.WaitOne();

            // The operations either completed or threw an exception.
            if (state.OperationException != null)
            {
                throw state.OperationException;
            }
            else
            {
                Console.WriteLine("The operation completed - {0}", state.StatusDescription);
            }
        }
        private static void EndGetStreamCallback(IAsyncResult ar)
        {
            FtpState state = (FtpState) ar.AsyncState;

            Stream requestStream = null;
            // End the asynchronous call to get the request stream.
            try
            {
                requestStream = state.Request.EndGetRequestStream(ar);
                // Copy the file contents to the request stream.
                const int bufferLength = 2048;
                byte[] buffer = new byte[bufferLength];
                int count = 0;
                int readBytes = 0;
                FileStream stream = File.OpenRead(state.FileName);
                do
                {
                    readBytes = stream.Read(buffer, 0, bufferLength);
                    requestStream.Write(buffer, 0, readBytes);
                    count += readBytes;
                }
                while (readBytes != 0);
                Console.WriteLine ("Writing {0} bytes to the stream.", count);
                // IMPORTANT: Close the request stream before sending the request.
                requestStream.Close();
                // Asynchronously get the response to the upload request.
                state.Request.BeginGetResponse(
                    new AsyncCallback (EndGetResponseCallback),
                    state
                );
            }
            // Return exceptions to the main application thread.
            catch (Exception e)
            {
                Console.WriteLine("Could not get the request stream.");
                state.OperationException = e;
                state.OperationComplete.Set();
                return;
            }
        }

        // The EndGetResponseCallback method
        // completes a call to BeginGetResponse.
        private static void EndGetResponseCallback(IAsyncResult ar)
        {
            FtpState state = (FtpState) ar.AsyncState;
            FtpWebResponse response = null;
            try
            {
                response = (FtpWebResponse) state.Request.EndGetResponse(ar);
                response.Close();
                state.StatusDescription = response.StatusDescription;
                // Signal the main application thread that
                // the operation is complete.
                state.OperationComplete.Set();
            }
            // Return exceptions to the main application thread.
            catch (Exception e)
            {
                Console.WriteLine ("Error getting response.");
                state.OperationException = e;
                state.OperationComplete.Set();
            }
        }
    }
}

Комментарии

Важно!

Мы не рекомендуем использовать класс для новой разработки FtpWebRequest . Дополнительные сведения и альтернативы см. в FtpWebRequestразделе WebRequest не следует использовать на GitHub.

Чтобы получить экземпляр FtpWebRequest, используйте Create метод . Класс также можно использовать для отправки WebClient и скачивания сведений с FTP-сервера. При использовании любого из этих подходов при указании сетевого ресурса, использующего схему FTP (например, "ftp://contoso.com"), FtpWebRequest класс предоставляет возможность программного взаимодействия с FTP-серверами.

Универсальный код ресурса (URI) может быть относительным или абсолютным. Если URI имеет форму "ftp://contoso.com/%2fpath" (%2f является escape-файлом "/"), то URI является абсолютным, а текущий каталог — /path. Однако если универсальный код ресурса (URI) имеет форму "ftp://contoso.com/path", .NET Framework сначала выполняет вход на FTP-сервер (используя имя пользователя и пароль, заданные свойством Credentials ), а затем для текущего каталога устанавливается значение <UserLoginDirectory>/path.

Необходимо иметь допустимое имя пользователя и пароль для сервера, или сервер должен разрешить анонимный вход. Вы можете указать учетные данные, используемые для подключения к серверу, задав Credentials свойство или включить их в UserInfo часть универсального кода ресурса (URI), переданного методу Create . При включении UserInfo сведений в URI Credentials свойство присваивается новые сетевые учетные данные с указанными именем пользователя и паролем.

Внимание!

EnableSsl Если свойство не равно true, все данные и команды, включая имя пользователя и пароль, отправляются на сервер в виде ясного текста. Любой пользователь, отслеживая сетевой трафик, может просматривать ваши учетные данные и использовать их для подключения к серверу. Если вы подключаетесь к FTP-серверу, которому требуются учетные данные и поддерживается протокол SSL, необходимо задать значение EnableSsltrue.

Необходимо WebPermission получить доступ к ресурсу FTP; SecurityException в противном случае возникает исключение.

Укажите команду FTP для отправки на сервер, задав свойству Method значение, определенное WebRequestMethods.Ftp в структуре. Чтобы передать текстовые данные, измените UseBinary свойство со значения по умолчанию (true) на false. Дополнительные сведения и ограничения см. в разделе Method.

При использовании FtpWebRequest объекта для отправки файла на сервер необходимо записать содержимое файла в поток запросов, полученный путем вызова GetRequestStream метода или его асинхронных аналогов , BeginGetRequestStream методов и EndGetRequestStream . Перед отправкой запроса необходимо выполнить запись в поток и закрыть поток.

Запросы отправляются на сервер путем вызова GetResponse метода или его асинхронных аналогов , BeginGetResponse методов и EndGetResponse . После завершения FtpWebResponse запрошенной операции возвращается объект . Объект FtpWebResponse предоставляет состояние операции и все данные, скачанные с сервера.

Значение времени ожидания для чтения или записи на сервер можно задать с помощью ReadWriteTimeout свойства . При превышении времени ожидания вызывающий метод вызывает исключение с заданным значением WebExceptionTimeout.WebExceptionStatus

Если при скачивании файла с FTP-сервера команда была выполнена успешно, содержимое запрошенного файла будет доступно в потоке объекта ответа. Доступ к этому потоку можно получить, вызвав GetResponseStream метод . Для получения дополнительной информации см. FtpWebResponse.

Proxy Если свойство задано напрямую или в файле конфигурации, обмен данными с FTP-сервером осуществляется через указанный прокси-сервер. Если указанный прокси-сервер является прокси-сервером HTTP, поддерживаются только DownloadFileкоманды , ListDirectoryи ListDirectoryDetails .

Кэшируется только скачаемое двоичное содержимое; то есть содержимое, полученное DownloadFile с помощью команды со свойством UseBinary , равным true.

Несколько FtpWebRequestэкземпляров повторно используйте существующие подключения, если это возможно.

Дополнительные сведения о протоколе FTP см. в разделе RFC 959: протокол передачи файлов.

Свойства

AuthenticationLevel

Возвращает или задает значения, указывающие уровень проверки подлинности и олицетворения, используемые для этого запроса.

(Унаследовано от WebRequest)
CachePolicy

Возвращает или задает политику кэширования для этого запроса.

(Унаследовано от WebRequest)
ClientCertificates

Возвращает или задает сертификаты, используемые для установки и шифрования подключения к FTP-серверу.

ConnectionGroupName

Возвращает или задает имя группы подключения, которая содержит точку обслуживания, используемую для отправки текущего запроса.

ContentLength

Возвращает или задает значение, игнорируемое классом FtpWebRequest.

ContentOffset

Получает или задает смещение в байтах для файла, загружаемого через этот запрос.

ContentType

Всегда создает исключение NotSupportedException.

CreatorInstance
Устаревшие..

Если переопределено в производном классе, получает объект фабрики, производный от класса IWebRequestCreate, который служит для создания объекта WebRequest для создания запроса по указанному универсальному коду ресурса (URI).

(Унаследовано от WebRequest)
Credentials

Возвращает или задает учетные данные, используемые для связи с FTP-сервером.

DefaultCachePolicy

Определяет политику кэширования по умолчанию для всех запросов FTP.

EnableSsl

Возвращает или задает объект Boolean, который указывает, что необходимо использовать SSL-соединение.

Headers

Возвращает пустой объект WebHeaderCollection.

ImpersonationLevel

Возвращает или задает уровень олицетворения для текущего запроса.

(Унаследовано от WebRequest)
KeepAlive

Возвращает или задает значение Boolean, которое указывает, следует ли закрывать управляющее подключение к FTP-серверу после завершения запроса.

Method

Возвращает или задает команду, которая будет отправлена на FTP-сервер.

PreAuthenticate

Всегда создает исключение NotSupportedException.

Proxy

Возвращает или задает прокси-сервер, используемый для связи с FTP-сервером.

ReadWriteTimeout

Возвращает или задает время ожидания при записи в поток или при чтении из него.

RenameTo

Возвращает или задает новое имя переименовываемого файла.

RequestUri

Возвращает универсальный код ресурса (URI), запрошенный этим экземпляром.

ServicePoint

Возвращает объект ServicePoint, используемый для подключения к FTP-серверу.

Timeout

Возвращает или задает количество миллисекунд для ожидания запроса.

UseBinary

Возвращает или задает значение Boolean, которое указывает тип данных для передачи файлов.

UseDefaultCredentials

Всегда создает исключение NotSupportedException.

UsePassive

Возвращает или задает поведение процесса передачи данных в клиентском приложении.

Методы

Abort()

Прерывает асинхронную операцию FTP.

BeginGetRequestStream(AsyncCallback, Object)

Начинает асинхронное открытие потока с содержимым запроса для записи.

BeginGetResponse(AsyncCallback, Object)

Начинает асинхронно отправлять запрос и получать ответ с FTP-сервера.

CreateObjRef(Type)

Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

(Унаследовано от MarshalByRefObject)
EndGetRequestStream(IAsyncResult)

Завершает асинхронную операцию в очереди, начинавшуюся с BeginGetRequestStream(AsyncCallback, Object).

EndGetResponse(IAsyncResult)

Завершает асинхронную операцию в очереди, начинавшуюся с BeginGetResponse(AsyncCallback, Object).

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetLifetimeService()
Устаревшие..

Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.

(Унаследовано от MarshalByRefObject)
GetObjectData(SerializationInfo, StreamingContext)
Устаревшие..

Заполняет объект SerializationInfo данными, необходимыми для сериализации целевого объекта.

(Унаследовано от WebRequest)
GetRequestStream()

Возвращает поток, используемый для выгрузки данных на FTP-сервер.

GetRequestStreamAsync()

Если переопределено во вложенном классе, возвращает Stream для записи данных в интернет-ресурс в ходе асинхронной операции.

(Унаследовано от WebRequest)
GetResponse()

Возвращает ответ FTP-сервера.

GetResponseAsync()

При переопределении во вложенном классе возвращает ответ на интернет-запрос в виде асинхронной операции.

(Унаследовано от WebRequest)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
InitializeLifetimeService()
Устаревшие..

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

(Унаследовано от MarshalByRefObject)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
MemberwiseClone(Boolean)

Создает неполную копию текущего объекта MarshalByRefObject.

(Унаследовано от MarshalByRefObject)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Явные реализации интерфейса

ISerializable.GetObjectData(SerializationInfo, StreamingContext)
Устаревшие..

Если переопределено во вложенном классе, заполняет экземпляр SerializationInfo данными, которые необходимы для сериализации WebRequest.

(Унаследовано от WebRequest)

Применяется к

См. также раздел