Проблемы перемещения файла с WinSCP в WebJob - PullRequest
1 голос
/ 04 июня 2019

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

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

Я обновил пакет NuSCet 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 я не отправил вам весь код, но я вызываю этот метод в своем конструкторе (использовался только один раз в моем веб-задании) или когда я проверяю, что сеанс закрыт в моем методе перемещения (я добавил эту часть для проверки состояния соединения, когда я увидел, что подвижная часть не работает).

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

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

Помогает ли?

Ответы [ 2 ]

0 голосов
/ 10 июня 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, указывающий на успех.Поэтому, если файл не перемещается, это ошибка сервера.

0 голосов
/ 04 июня 2019

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

Вы создаете новый 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, которое вы, возможно, захотите добавить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...