Проблемы с перемещением файла с WinSCP в веб-задании

У меня есть проблемы с перемещением файла из репозитория в другой в веб-задании. Использую команду _session.MoveFile("mypathsource","mypathdestination"). Моя веб-работа запускается каждые 10 минут.

Когда я развертываю свое веб-задание, он перемещает файл, но после нескольких итераций моего веб-задания он не перемещает файл. Это не вызвало никаких исключений. Он просто не перемещает файл.

Я обновил пакет NuGet WinSCP до версии 5.15.2. и я использую .Net framework 4.6.1.

public void SendFileToArchive(string fileName)
{
    _log.DebugFormat("Deleting file on local path.");
    File.Delete($"{_config.LocalPath}\\{fileName}");
    if (!_session.Opened)
    {
       _log.DebugFormat("Session is closed -> Open it.");
        this.OpenSession();
    }
    _log.DebugFormat("Move file.");
    _session.MoveFile($"{fileName}", "Archive/" + fileName);
    if (_session.FileExists(fileName))
    {
        _log.Error("File hasn't be moved");
    }
 }

private void OpenSession()
{
   // Configurer les options de session
   SessionOptions sessionOptions = new SessionOptions
   {
       Protocol = Protocol.Sftp,
       HostName = _config.FtpUrl,
       UserName = _config.FtpLogin,
       Password = _config.FtpPwd,
       SshHostKeyFingerprint = _config.SshHostKeyFingerprint,
    };
    sessionOptions.AddRawSettings("ProxyPort", "0");
    _session = new Session();
    // Connecter
    _session.Open(sessionOptions);
}

Я ожидаю, что файл будет перемещен или, по крайней мере, процесс вызовет исключение. Кто-нибудь знает, что я делаю не так?

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

Для openSession я не отправил вам весь код, но я вызываю этот метод в своем конструкторе (используется только один раз в моем веб-задании) или когда я проверяю, что сеанс закрыт в моем методе перемещения (я добавил эту часть для проверки состояние связи, когда я увидел, что подвижная часть не работает).

И, конечно же, у меня есть метод удаления, который вызывается, когда я выполнил весь процесс:

public void DisposeSession()
{
    if (this._session.Opened)
    {
        this._session.Close();
    }

    this._session.Dispose();
}

Вот журнал:

. 2019-06-05 15:21:21.420 Listing file "FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.420 Type: SSH_FXP_LSTAT, Size: 44, Number: 5639
< 2019-06-05 15:21:21.420 Type: SSH_FXP_STATUS, Size: 26, Number: 5380
. 2019-06-05 15:21:21.420 Discarding reserved response
< 2019-06-05 15:21:21.420 Type: SSH_FXP_ATTRS, Size: 54, Number: 5639
. 2019-06-05 15:21:21.420 FILETOMOVE_20190524_010139.json;-;1203;2019-05-23T23:01:40.000Z;3;"root" [0];"root" [0];rwxrwxrwx;1
< 2019-06-05 15:21:21.420 Script: -rwxrwxrwx   0 root     root          1203 May 23 23:01:40 2019 FILETOMOVE_20190524_010139.json
> 2019-06-05 15:21:21.482 Script: stat -- "Archive/FILETOMOVE_20190524_010139.json"
. 2019-06-05 15:21:21.482 Listing file "Archive/FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.482 Type: SSH_FXP_LSTAT, Size: 52, Number: 5895
< 2019-06-05 15:21:21.482 Type: SSH_FXP_ATTRS, Size: 54, Number: 5895
. 2019-06-05 15:21:21.482 FILETOMOVE_20190524_010139.json;-;1203;2019-05-23T23:01:40.000Z;3;"root" [0];"root" [0];rwxrwxrwx;1
< 2019-06-05 15:21:21.482 Script: -rwxrwxrwx   0 root     root          1203 May 23 23:01:40 2019 FILETOMOVE_20190524_010139.json
> 2019-06-05 15:21:21.561 Script: mv "FILETOMOVE_20190524_010139.json" "Archive/FILETOMOVE_20190524_010139.json"
. 2019-06-05 15:21:21.561 Listing file "FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.561 Type: SSH_FXP_LSTAT, Size: 44, Number: 6151
< 2019-06-05 15:21:21.577 Type: SSH_FXP_ATTRS, Size: 54, Number: 6151
. 2019-06-05 15:21:21.577 FILETOMOVE_20190524_010139.json;-;1203;2019-05-23T23:01:40.000Z;3;"root" [0];"root" [0];rwxrwxrwx;1
. 2019-06-05 15:21:21.577 Moving file "FILETOMOVE_20190524_010139.json" to "Archive/FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.577 Type: SSH_FXP_RENAME, Size: 87, Number: 6418
< 2019-06-05 15:21:21.577 Type: SSH_FXP_STATUS, Size: 26, Number: 6418
< 2019-06-05 15:21:21.577 Status code: 0
< 2019-06-05 15:21:21.577 Script: FILETOMOVE_20190524_010139.json
> 2019-06-05 15:21:21.624 Script: stat -- "FILETOMOVE_20190524_010139.json"
. 2019-06-05 15:21:21.624 Listing file "FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.624 Type: SSH_FXP_LSTAT, Size: 44, Number: 6663
< 2019-06-05 15:21:21.624 Type: SSH_FXP_ATTRS, Size: 54, Number: 6663
. 2019-06-05 15:21:21.624 FILETOMOVE_20190524_010139.json;-;1203;2019-05-23T23:01:40.000Z;3;"root" [0];"root" [0];rwxrwxrwx;1
< 2019-06-05 15:21:21.624 Script: -rwxrwxrwx   0 root     root          1203 May 23 23:01:40 2019 FILETOMOVE_20190524_010139.json

Помогает?


person Gilles B    schedule 04.06.2019    source источник
comment
Файл журнала сеанса, пожалуйста! (Session.SessionLogPath)   -  person Martin Prikryl    schedule 04.06.2019
comment
Нет, я просил журнал сеанса.   -  person Martin Prikryl    schedule 05.06.2019
comment
хорошо, извините. Я постараюсь восстановить его, когда проблема возникнет снова.   -  person Gilles B    schedule 05.06.2019


Ответы (2)


Я предполагаю, что вы хотите переместить файл на удаленный сервер (вы также удаляете локальный файл в этом методе).

Вы создаете новый Session каждый раз, когда вызываете OpenSession() - без закрытия / удаления старого. Вы должны создать сеанс в конструкторе только один раз. Это могло быть проблемой.

Кроме того, удаленный файл не может быть перемещен, если место назначения уже существует - у вас нет проверки на это, но вы можете сделать это иначе.

Подумайте, нужно ли вам sessionOptions.AddRawSettings("ProxyPort", "0");

Вы можете найти дополнительную информацию в журнале сеанса.

Я сделал класс для тестирования на основе вашего кода. У меня работает работает - также для повторных звонков:

using System.Diagnostics;
using System.IO;
using WinSCP;

namespace WinSCPTest
{
    public class SftpRemoteMoveTester
    {
        const char SftpDirectorySeparatorChar = '/';

        static readonly SessionOptions SessionOptions = new SessionOptions
        {
            Protocol = Protocol.Sftp,
            HostName = SftpConfig.HostName,
            UserName = SftpConfig.UserName,
            Password = SftpConfig.Password,
            SshHostKeyFingerprint = SftpConfig.SshHostKeyFingerprint,
        };

        Session _sftpSession;

        public SftpUploadTester()
        {
            _sftpSession = new Session();
        }

        public void MoveRemoteFile(
            string remoteSourceDirectoryPath,
            string fileName,
            string remoteDestinationDirectoryPath)
        {
            var remoteSourceFilePath = CombineSftpPath(remoteSourceDirectoryPath, fileName);
            var remoteDestinationFilePath = CombineSftpPath(remoteDestinationDirectoryPath, fileName);

            OpenSessionIfNeeded();

            if (!_sftpSession.FileExists(remoteSourceFilePath))
            {
                Debug.WriteLine("Remote source file does not exists -> return");
                return;
            }

            if (_sftpSession.FileExists(remoteDestinationFilePath))
            {
                Debug.WriteLine("Remote destination file already exists -> return");
                return;
            }

            _sftpSession.MoveFile(remoteSourceFilePath, remoteDestinationFilePath);

            if (_sftpSession.FileExists(remoteSourceFilePath))
            {
                Debug.WriteLine("File hasn't be moved from source dir");
            }

            if (_sftpSession.FileExists(remoteSourceFilePath))
            {
                Debug.WriteLine("File doesn't exists in destination dir");
            }
        }

        public void OpenSessionIfNeeded()
        {
            if (!_sftpSession.Opened)
            {
                Debug.WriteLine("Session is closed -> Open it.");
                _sftpSession.Open(SessionOptions);
            }
        }

        string CombineSftpPath(params string[] parts)
        {
            return Path.Combine(parts)
                .Replace(Path.DirectorySeparatorChar, SftpDirectorySeparatorChar);
        }
    }
}

Пример не включает никакого удаления _sftpSession, которое вы, возможно, захотите добавить.

person Ulrik Nielsen    schedule 04.06.2019
comment
Привет, Ульрик, спасибо за ответ. - person Gilles B; 05.06.2019

> 2019-06-05 15:21:21.561 Script: mv "FILETOMOVE_20190524_010139.json" "Archive/FILETOMOVE_20190524_010139.json"
. 2019-06-05 15:21:21.561 Listing file "FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.561 Type: SSH_FXP_LSTAT, Size: 44, Number: 6151
< 2019-06-05 15:21:21.577 Type: SSH_FXP_ATTRS, Size: 54, Number: 6151
. 2019-06-05 15:21:21.577 FILETOMOVE_20190524_010139.json;-;1203;2019-05-23T23:01:40.000Z;3;"root" [0];"root" [0];rwxrwxrwx;1
. 2019-06-05 15:21:21.577 Moving file "FILETOMOVE_20190524_010139.json" to "Archive/FILETOMOVE_20190524_010139.json".
> 2019-06-05 15:21:21.577 Type: SSH_FXP_RENAME, Size: 87, Number: 6418
< 2019-06-05 15:21:21.577 Type: SSH_FXP_STATUS, Size: 26, Number: 6418
< 2019-06-05 15:21:21.577 Status code: 0

Как видно из журнала, сервер не сообщает об ошибках. Он возвращает код состояния 0, что указывает на успех. Так что если файл не перемещается, это вина сервера.

person Martin Prikryl    schedule 10.06.2019