2012-11-16 36 views
10

मुझे अजीब WebClient.UploadFileAsync() के व्यवहार के साथ कुछ मदद चाहिए। मैं एक दूरस्थ HTTP सर्वर (nginx) usind पोस्ट विधि में एक फ़ाइल अपलोड कर रहा हूँ। POST को एक PHP स्क्रिप्ट (जिसे पता संदर्भित करता है) को संसाधित किया जाता है।वेब क्लाइंट अपलोडफाइलएसिंक प्रगति रिपोर्टिंग में अजीब व्यवहार

मैं इस सरल कोड

public void uploadFile(string filePath) 
{ 
    webClient = new WebClient(); 
    webClient.Credentials = new NetworkCredential(Constant.HTTPUsername,Constant.HTTPPassword); 
    webClient.Headers.Add("Test", TestKey); 
    webClient.UploadProgressChanged += webClient_UploadProgressChanged; 
    webClient.UploadFileCompleted += webClient_UploadFileCompleted; 

    try 
    { 
     webClient.UploadFileAsync(new Uri(Address), "POST", filePath); 
    } 
    catch (Exception error) 
    { 
     throw new CustomException(error.Message); 
    } 
} 

है और UploadProgressChanged में मैं बस दी ProgressPercentage के साथ एक प्रगति बार अद्यतन करें। पहला मुद्दा है कि प्रगति प्रतिशत की सूचना दी, के साथ किसी भी फ़ाइल आकार है:

[17.38.14] Progress: 0 Bytes Sent: 175/269264 
[17.38.14] Progress: 1 Bytes Sent: 8367/269264 
[17.38.14] Progress: 3 Bytes Sent: 16559/269264 
[17.38.14] Progress: 4 Bytes Sent: 24751/269264 
[17.38.14] Progress: 6 Bytes Sent: 32943/269264 
[17.38.14] Progress: 7 Bytes Sent: 41135/269264 
[17.38.14] Progress: 9 Bytes Sent: 49327/269264 
[17.38.14] Progress: 10 Bytes Sent: 57519/269264 
[17.38.14] Progress: 12 Bytes Sent: 65711/269264 
[17.38.14] Progress: 13 Bytes Sent: 73903/269264 
[17.38.14] Progress: 15 Bytes Sent: 82095/269264 
[17.38.14] Progress: 16 Bytes Sent: 90287/269264 
[17.38.14] Progress: 18 Bytes Sent: 98479/269264 
[17.38.15] Progress: 19 Bytes Sent: 106671/269264 
[17.38.15] Progress: 21 Bytes Sent: 114863/269264 
[17.38.15] Progress: 22 Bytes Sent: 123055/269264 
[17.38.15] Progress: 24 Bytes Sent: 131247/269264 
[17.38.15] Progress: 25 Bytes Sent: 139439/269264 
[17.38.15] Progress: 27 Bytes Sent: 147631/269264 
[17.38.16] Progress: 28 Bytes Sent: 155823/269264 
[17.38.16] Progress: 30 Bytes Sent: 164015/269264 
[17.38.16] Progress: 31 Bytes Sent: 172207/269264 
[17.38.16] Progress: 33 Bytes Sent: 180399/269264 
[17.38.16] Progress: 35 Bytes Sent: 188591/269264 
[17.38.16] Progress: 36 Bytes Sent: 196783/269264 
[17.38.17] Progress: 38 Bytes Sent: 204975/269264 
[17.38.17] Progress: 39 Bytes Sent: 213167/269264 
[17.38.17] Progress: 41 Bytes Sent: 221359/269264 
[17.38.17] Progress: 42 Bytes Sent: 229551/269264 
[17.38.17] Progress: 44 Bytes Sent: 237743/269264 
[17.38.17] Progress: 45 Bytes Sent: 245935/269264 
[17.38.17] Progress: 47 Bytes Sent: 254127/269264 
[17.38.18] Progress: 48 Bytes Sent: 262319/269264 
[17.38.18] Progress: 49 Bytes Sent: 269220/269264 
[17.38.18] Progress: 50 Bytes Sent: 269264/269264 
[17.38.25] Progress: -50 Bytes Sent: 269264/269264 
[17.38.25] Progress: 100 Bytes Sent: 269264/269264 
[17.38.25] FileCompleted event raised! 

तो, वेब पर खोज, मैं पाया है कि 50> 100 से कूद, में सिर्फ एक डिजाइन पसंद है प्रतिशत रिपोर्ट .. और इसलिए मैं इसके साथ ठीक हूं। अजीब मुद्दा यह है कि 50% (जब पूरी फ़ाइल भेजी गई थी) पर भी, नेटवर्क इंटरफेस अभी भी यातायात उत्पन्न करता है और अभी भी अपलोड हो रहा है। वास्तव में, जैसा कि आप ऊपर दिए गए लॉग में समय से देख सकते हैं, अपलोड फ़ाइल को खोलने के लिए 7 सेकंड लगते हैं, अपलोडफाइल कॉम्प्लेटेडएवेंट.इन तथ्य को बढ़ाने के लिए, इस बीच, मैं अभी भी HTTP पर फ़ाइल भेज रहा हूं।

यहां मुद्दा यह है कि मैं अपने यूआई को विश्वसनीय रूप से अपडेट नहीं कर सकता: प्रगति पट्टी 50% तक बढ़ेगी लेकिन फिर यह अपलोड पूर्णता के लिए इंतजार कर रही है (और यह एक बुरा व्यवहार है, बड़ी फाइल के साथ, इस बार बढ़ता है काफी)।

सवाल यह है: मैं उपयोगकर्ता को फ़ाइल अपलोड प्रगति के बारे में अद्यतन कैसे रख सकता हूं?

धन्यवाद।

पीएस विधि पूरी तरह से ठीक काम करती है और फ़ाइल दूरस्थ सर्वर पर सही ढंग से अपलोड की जाती है। प्रगति रिपोर्टिंग के साथ एकमात्र मुद्दा है।

+0

यदि सब कुछ ठीक है तो अपना समाधान उत्तर के रूप में पोस्ट करें और इसे स्वीकार करें। –

+0

कभी-कभी यहां प्रश्न पोस्ट करने से आप इसे समझने में भी मदद करते हैं :) –

उत्तर

2

मुझे अभी समस्या मिली है: यह मूल HTTP प्रमाणीकरण में है। कुछ अजीब कारणों से, भले ही मैं प्रमाण-पत्र निर्दिष्ट करता हूं, वेब क्लाइंट HTTP शीर्षलेख में प्रमाण-पत्र निर्दिष्ट किए बिना पहला POST अनुरोध सबमिट करता है। सर्वर के अनुरोध के साथ उत्तर देने के बाद, यह प्रमाण पत्र, सही, प्रमाण पत्र निर्दिष्ट करने वाला दूसरा POST अनुरोध सबमिट करता है। उन 2 पुनः प्रयासों में, मेरा आवेदन फ़ाइल को 2 बार भेजता है!

string authInfo = userName + ":" + userPassword; 
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
req.Headers["Authorization"] = "Basic " + authInfo; 
:

समाधान मैन्युअल रूप से प्रमाणीकरण हेडर को जोड़े (और WebClient.Credentials को हटाने .. लाइन द्वारा HTTP बुनियादी प्रमाणीकरण के लिए मजबूर करने के लिए है (यही कारण है कि मैं अपलोड गतिविधि के बाद भी फाइल पूरी तरह से भेजा गया था अनुभव है)

इस तरह पहला (और केवल) POST अनुरोध, प्रमाणीकरण शीर्षलेख के साथ सही ढंग से सबमिट किया जाएगा, और रिपोर्ट प्रगति सही है (केवल साझा करने के लिए, मैं उपरोक्त कारण के लिए अपनी प्रगति पट्टी में प्रगति की रिपोर्ट करता हूं (e.PogressPercentage * 2)

1
string authInfo = userName + ":" + userPassword; 
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
req.Headers["Authorization"] = "Basic " + authInfo; 

अपनी प्रगति रिपोर्टिंग प्रयोजनों के लिए e.ProgressPercentage * 2 के साथ अपनी पोस्ट अनुरोध की शुरुआत में इस जगह।