FtpWebRequest ProtocolViolationException - PullRequest
0 голосов
/ 25 мая 2020

Попытка создать асинхронную функцию загрузки ftp c с IProgress и токеном отмены, но я получаю «ProtocolViolationException: операция недопустима из-за текущего состояния объекта» в функции GetRequestStreamAsyn c ()

Я использовал это как вдохновение асинхронная загрузка c с IProgress и токеном отмены

        public async Task DownloadWithProgressAsync(string remoteFilepath, string localFilepath, IProgress<decimal> progress, CancellationToken token)
        {
            const int bufferSize = 128 * 1024;  // 128kb buffer
            progress.Report(0m);

            var remoteUri = new Uri(_baseUrl + remoteFilepath);
            Debug.Log($"Download\nuri: {remoteUri}");

            var request = (FtpWebRequest)WebRequest.CreateDefault(remoteUri);
            request.Method = WebRequestMethods.Ftp.DownloadFile;
            request.Credentials = new NetworkCredential(_username, _password);

            token.ThrowIfCancellationRequested();

            using (var fileStream = new FileStream(localFilepath, FileMode.OpenOrCreate, FileAccess.Write,
                FileShare.Write, bufferSize, true))
            {
                using (var ftpStream = await request.GetRequestStreamAsync())
                {
                    var buffer = new byte[bufferSize];
                    int read;
                    while ((read = await ftpStream.ReadAsync(buffer, 0, buffer.Length, token) ) > 0)
                    {
                        await fileStream.WriteAsync(buffer, 0, read, token);
                        var percent = (decimal)ftpStream.Position / ftpStream.Length;
                        progress.Report(percent);
                    }
                }
            }

            var response = (FtpWebResponse)await request.GetResponseAsync();
            var success = (int)response.StatusCode >= 200 && (int)response.StatusCode < 300;
            response.Close();
            if (!success)
                throw new Exception(response.StatusDescription);
        }
...