Сайт на Asp.Net Core 3.1, люди загружают на сайт файлы, эти файлы нужно сохранить на FTP.
Для загрузки используется FtpWebRequest, Stream создаётся таким образом:
public Stream GetUploadStream(string filePath)
{
var request = (FtpWebRequest)WebRequest.Create(_ftp.Server + filePath);
request.Credentials = _credential;
request.EnableSsl = true;
request.UseBinary = true;
request.Method = WebRequestMethods.Ftp.UploadFile;
return request.GetRequestStream();
}
Сама загрузка происходит таким образом
// file - IFormFile из multipart form
var requestStream = ftp.GetUploadStream(filePath);
await file.OpenReadStream().CopyToAsync(requestStream);
requestStream.Close();
Этот код прекрасно работает под Windows (при запуске в студии через iis express), но не работает при запуске на Linux.
Ошибка при попытке загрузить файл на линуксе такая
Message = The remote server returned an error: (550) File unavailable (e.g., file not found, no access).
Если приводить Exception к WebException и смотреть ((FtpWebResponse) e.Response).StatusDescription, то ошибка такая
550 read tcp ip:port-\u003Eip:port: read: connection reset by peer\r\n
При этом создаётся файл нулевой длинны.
Конфиги, ftp сервер, логин и пароль - всё одинаковое.
Пробовал вместо потока отправлять массив байтов (точнее массив чаров из нескольких символов), и это успешно срабатывало. При этом преобразование входного файла в массив байт не помогает - ошибка та же.
В чём может быть проблема и как её решить?