2014-09-12 7 views
5

फेंकता मैं एक आवेदन है किSSH.NET अपलोड एकाधिक फ़ाइलें एसिंक्रोनस रूप से एक अपवाद

  1. प्रक्रिया एक CSV फ़ाइल,
  2. JObject प्रत्येक रिकॉर्ड के लिए CSV फ़ाइल में बना सकते हैं और JSON txt फ़ाइल के रूप में बचा लेगा बनाने रहा हूँ, और अंत में
  3. 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. 

मैं करने में सक्षम होने की जरूरत है एक ही समय में कई फाइलें अपलोड करें। या मुझे बताएं कि आईआईएस या एसएफटीपी सर्वर को इस प्रकार के ऑपरेशन के लिए कॉन्फ़िगरेशन की आवश्यकता है और यह क्या है।

मैं क्या गलत कर रहा हूं? आपका सहयोग सराहनीय है।

+0

ऐसा लगता है कि आपका एफ़टीपी होस्ट आपको प्रति क्लाइंट 2 एक साथ कनेक्शन तक सीमित कर रहा है, अगर आप एक समय में 2 ग्राहकों को कम करते समय काम करने के लिए काम कर सकते हैं। –

+0

हाँ .. यह वही है जो मैंने पहले सोचा था। लेकिन यह वास्तव में कभी-कभी 2 एक साथ अपलोड के साथ भी काम नहीं करता है और दूसरी त्रुटि फेंकता है। – Aamir

+0

एफ़टीपी होस्ट आपको सीमित कर रहा है और कभी-कभी यदि आपका होस्ट बहुत व्यस्त है (अन्य क्लाइंट की सेवा कर रहा है), तो इसका जवाब नहीं दे सकता है। 50 फाइलें अपलोड करना एक खराब तर्क है, आदर्श रूप में, इसे सभी को एक फाइल में ज़िपित किया जाना चाहिए और एक फ़ाइल अपलोड की जानी चाहिए, जिससे कई 50 अनुरोध नेटवर्क संसाधनों का अपशिष्ट हो। –

उत्तर

2

पैटर्न पूरी तरह से बॉट किया गया है।

आप सही जगहों पर इंतजार नहीं कर रहे हैं और न ही आप सही जगहों पर शामिल हो रहे हैं जो विलंबता को कम करने के लिए भेजने से पहले होना चाहिए।

कनेक्ट नहीं किया गया त्रुटि इसलिए है क्योंकि कनेक्ट होने से पहले जुड़ना समाप्त हो गया है।

बड़े लोगों पर विफल रहता है क्योंकि आप बहुत लंबे समय तक कुछ भी नहीं भेजते हैं।

+0

धन्यवाद @ जे। क्या आप कृपया मुझे कुछ कोड के माध्यम से मार्गदर्शन करने का प्रयास कर सकते हैं? मैं तुम्हारा मतलब नहीं मिला। आप मेरे द्वारा लिखे गए कोड को संशोधित करके मुझे दिखा सकते हैं। – Aamir

+0

कनेक्ट करने से पहले जुड़ें। एक अपलोड करो किया हुआ। – Jay

+0

आप अधिक विशिष्ट होने के लिए सी # कोड या पेस्ट/संशोधित खान आ सकते थे। – Aamir

संबंधित मुद्दे