在WebJob中使用WinSCP移动文件

时间:2019-06-04 14:33:32

标签: c# sftp azure-webjobs winscp winscp-net

我在将文件从存储库移动到Webjob中的另一个文件时遇到一些问题。 我使用命令_session.MoveFile("mypathsource","mypathdestination")。 我的网络作业每10分钟触发一次。

当我部署webjob时,它将移动文件,但是在我的webjob进行几次迭代后,它将不会移动文件。它不会引发任何异常。只是不移动文件。

我已经将NuGet软件包WinSCP更新到版本5.15.2。我使用的是.Net框架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,我还没有发送全部代码给我,但是我在构造函数中调用了该方法(在我的webjob中仅使用了一次),或者当我检查move方法中的会话是否关闭时(我添加了这一部分)当我看到移动部分不起作用时检查连接状态)。

当然,当我完成所有过程时,我有一个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 :(得分:0)

我假设您想在远程服务器上移动文件(您还将在该方法中删除本地文件)。

每次调用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

该示例不包括您可能要添加的任何{{1}}处理方式。

答案 1 :(得分:0)

> 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,表示成功。因此,如果文件不移动,则是服务器故障。