0

我编写了以下返回的函数也返回 SftpFile

public (DataTable, string, SftpFile) ReadFileFromSftp(List<string> headers ,InboundFileConfiguration configuration, ILogger logger) 
        {
            try
            {
                if (!sftpClient.IsConnected)
                    sftpClient.Connect();
                var fileToBeRead = sftpClient.ListDirectory(configuration.SftpFileUploadPath)
                                             .Where(x => x.Name.Contains(configuration.InterfaceNamePattern))
                                             .OrderByDescending(x => x.LastWriteTimeUtc).FirstOrDefault();
                if (fileToBeRead == null)
                    logger.LogError(ErrorMessages.NoFilePresentOnTheAzureStorageToRead);
fileToBeRead.Delete();
                using (var remoteFileStream = sftpClient.OpenRead(fileToBeRead.FullName))
                {
                    using (var memoryStream = new MemoryStream())
                    {
                        remoteFileStream.CopyTo(memoryStream);
                        RemoveArchivedFilesAfterRetentionPeriod(configuration.SftpFileArchivePath, configuration.InterfaceNamePattern, configuration.RetentionPeriod, logger);
                        memoryStream.Position = 0;
                        return (ReadMemoryStreamContents(memoryStream, configuration.Delimeter, headers, logger), fileToBeRead.Name, fileToBeRead);
                    }
                }
            }
            catch (Exception ex)
            {
                logger.LogError(ex, ex.Message);
            }
            finally
            {
                if (sftpClient.IsConnected)
                    sftpClient.Disconnect();
            }
            return (null, null, null);
        }

当我在上面的函数中编写以下代码时:

fileToBeRead.Delete();

它可以工作,但是当我在此函数之外删除文件时,它会引发以下异常:

Cannot access a disposed object. Object name: 'Renci.SshNet.Sftp.SftpSession'.

请帮我

4

1 回答 1

0

我找到了解决方案,即:

我创建了 sftpClient 作为静态连接。我正在调用该类的一个函数,ReadFileFromSftp然后我正在关闭finally块中的连接。同样,当我调用同一个类的另一个方法并尝试建立连接时。它抛出异常 -Cannot access a disposed object. Object name: 'Renci.SshNet.Sftp.SftpSession'因为连接已经在finally第一个方法的块中处理。我只是不需要断开静态连接。

于 2021-08-24T11:01:37.047 回答