फेंकता मैं एक आवेदन है किSSH.NET अपलोड एकाधिक फ़ाइलें एसिंक्रोनस रूप से एक अपवाद
- प्रक्रिया एक
CSV
फ़ाइल, JObject
प्रत्येक रिकॉर्ड के लिएCSV
फ़ाइल में बना सकते हैं और JSON txt फ़ाइल के रूप में बचा लेगा बनाने रहा हूँ, और अंत मेंSFTP
सर्वर
करने के लिए इन सभी JSON फाइल अपलोड एक के लिए चारों ओर देखने के बाद तीसरे बिंदु के लिए मुफ्त लाइब्रेरी, मैंने 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();
}
हालांकि JSON रिकॉर्ड के हजारों में CSV फ़ाइल परिणाम है, लेकिन मैं कम से कम 50 के बैच में इन अपलोड करना चाहते हैं यह ProcessJsonObjects
हमेशा एक समय में 50 JObject
एस की एक सूची प्राप्त करता है जिसे मैं एसएफटीपी सर्वर पर असीमित रूप से अपलोड करना चाहता हूं। 2 ठीक काम करता है के लिए
Session operation has timed out
बैच का आकार घटाना लेकिन कभी कभी निम्न त्रुटि में परिणाम है: लेकिन मैं UploadDocumentAsync
विधि के client.Connect();
लाइन पर निम्न त्रुटि प्राप्त
Client not connected.
मैं करने में सक्षम होने की जरूरत है एक ही समय में कई फाइलें अपलोड करें। या मुझे बताएं कि आईआईएस या एसएफटीपी सर्वर को इस प्रकार के ऑपरेशन के लिए कॉन्फ़िगरेशन की आवश्यकता है और यह क्या है।
मैं क्या गलत कर रहा हूं? आपका सहयोग सराहनीय है।
ऐसा लगता है कि आपका एफ़टीपी होस्ट आपको प्रति क्लाइंट 2 एक साथ कनेक्शन तक सीमित कर रहा है, अगर आप एक समय में 2 ग्राहकों को कम करते समय काम करने के लिए काम कर सकते हैं। –
हाँ .. यह वही है जो मैंने पहले सोचा था। लेकिन यह वास्तव में कभी-कभी 2 एक साथ अपलोड के साथ भी काम नहीं करता है और दूसरी त्रुटि फेंकता है। – Aamir
एफ़टीपी होस्ट आपको सीमित कर रहा है और कभी-कभी यदि आपका होस्ट बहुत व्यस्त है (अन्य क्लाइंट की सेवा कर रहा है), तो इसका जवाब नहीं दे सकता है। 50 फाइलें अपलोड करना एक खराब तर्क है, आदर्श रूप में, इसे सभी को एक फाइल में ज़िपित किया जाना चाहिए और एक फ़ाइल अपलोड की जानी चाहिए, जिससे कई 50 अनुरोध नेटवर्क संसाधनों का अपशिष्ट हो। –