我正在创建一个
的应用程序CSV
文件,JObject
文件中的每条记录创建CSV
并将JSON保存为txt文件,最后SFTP
服务器在寻找第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服务器是否需要配置此类操作以及它是什么。
我做错了什么?非常感谢您的帮助。
答案 0 :(得分:2)
模式完全拙劣。
您没有在正确的位置等待,也没有在发送之前加入正确的位置以减少延迟。
未连接错误是因为在连接之前连接已完成。
因为你没有发送任何东西太久而导致较大的失败。