SSH.NET异步上传多个文件会引发异常

时间:2014-09-12 13:25:50

标签: c# task-parallel-library sftp ssh.net

我正在创建一个

的应用程序
  1. 处理CSV文件,
  2. JObject文件中的每条记录创建CSV并将JSON保存为txt文件,最后
  3. 将所有这些JSON文件上传到SFTP服务器
  4. 在寻找第3点的免费图书馆之后,我决定使用SSH.NET

    我创建了以下类来异步执行上传操作。

    public class JsonFtpClient : IJsonFtpClient
    {
        private string _sfptServerIp, _sfptUsername, _sfptPassword;
    
        public JsonFtpClient(string sfptServerIp, string sfptUsername, string sfptPassword)
        {
            _sfptServerIp = sfptServerIp;
            _sfptUsername = sfptUsername;
            _sfptPassword = sfptPassword;
        }
    
        public Task<string> UploadDocumentAsync(string sourceFilePath, string destinationFilePath)
        {
            return Task.Run(() =>
            {
                using (var client = new SftpClient(_sfptServerIp, _sfptUsername, _sfptPassword))
                {
                    client.Connect();
    
                    using (Stream stream = File.OpenRead(sourceFilePath))
                    {
                        client.UploadFile(stream, destinationFilePath);
                    }
    
                    client.Disconnect();
                }
                return (destinationFilePath);
            });
        }
    }
    

    UploadDocumentAsync方法返回TPL Task,以便我可以调用它来异步上传多个文件。

    我从以下方法中调用此UploadDocumentAsync方法,该方法位于不同的类中:

    private async Task<int> ProcessJsonObjects(List<JObject> jsons)
    {
        var uploadTasks = new List<Task>();
        foreach (JObject jsonObj in jsons)
        {
            var fileName = string.Format("{0}{1}", Guid.NewGuid(), ".txt");
    
            //save the file to a temp location
            FileHelper.SaveTextIntoFile(AppSettings.ProcessedJsonMainFolder, fileName, jsonObj.ToString());
    
            //call the FTP client class and store the Task in a collection
            var uploadTask = _ftpClient.UploadDocumentAsync(
                    Path.Combine(AppSettings.ProcessedJsonMainFolder, fileName),
                    string.Format("/Files/{0}", fileName));
    
            uploadTasks.Add(uploadTask);
        }
    
        //wait for all files to be uploaded
        await Task.WhenAll(uploadTasks);
    
        return jsons.Count();
    }
    

    尽管CSV文件会产生数千条JSON记录,但我想要至少50个批量上传这些记录。这个ProcessJsonObjects始终会收到50个JObject的列表。想要异步上传到SFTP服务器。但是,我在client.Connect();方法的UploadDocumentAsync行收到以下错误:

    Session operation has timed out
    

    将批量大小减小到2可以正常工作,但有时会导致以下错误:

    Client not connected. 
    

    我需要能够同时上传多个文件。或者告诉我IIS或SFTP服务器是否需要配置此类操作以及它是什么。

    我做错了什么?非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

模式完全拙劣。

您没有在正确的位置等待,也没有在发送之前加入正确的位置以减少延迟。

未连接错误是因为在连接之前连接已完成。

因为你没有发送任何东西太久而导致较大的失败。