2009-06-15 39 views
9

मैं कोई WebMethod जो एक बाइट सरणी स्वीकार करता है और उसके बाद के साथ एक मानक सोप वेब सेवा है "अपर्याप्त सिस्टम संसाधन का अनुरोध सेवा को पूरा करने के लिए मौजूद" एकFile.WriteAllBytes का कारण बनता है त्रुटि

[WebMethod(true)] 
WriteFile(byte[] Data, string FilePath) 
{ 

    File.WriteAllBytes(FilePath, Data); 
} 

करता है तो इस प्रक्रिया में पारित हो जाता है तो बड़ी फाइल, उदाहरण के लिए 2 मेग यह निम्न त्रुटि संदेश के साथ बाहर बमबारी कर रहा है:

  • :

    अपर्याप्त सिस्टम संसाधन का अनुरोध सेवा

    पूरा करने के लिए स्टैक ट्रेस मैं हो रही है को देखते हुए मौजूद System.IO.File.WriteAllBytes

  • System.IO.FileStream.Write
  • System.IO.FileStream.WriteCo फिर
  • System.IO .__ Error.WinIOError
  • System.IO.IOException: अपर्याप्त सिस्टम संसाधन therequested सेवा पूरी करने के लिए

मैं ऐसे maxRequestLength स्थापित करने और समय समाप्ति को क्रियान्वित करने के रूप में सभी स्पष्ट बातें की कोशिश की है मौजूद अधिक यथार्थवादी सेटिंग्स के लिए:

<httpRuntime maxRequestLength="409600" executionTimeout="900"/> 

यह अभी भी उपरोक्त के साथ विफल होने लगता है। यदि आप एक छोटी फ़ाइल भेजते हैं तो यह डिस्क ठीक से बचाता है .. तो यह या तो फ़ाइल आकार या समय है जो समस्या है।

क्या किसी को किसी और चीज के बारे में पता है जो मैं इसे हल करने के लिए कर सकता हूं?

धन्यवाद

डेव

उत्तर

0

एक 409,600 की maxRequestLength 400KB के बारे में करने के लिए डेटा आकार को सीमित कर देगा, तो एक 2Mb फ़ाइल बहुत इस पार हो जाएगी।

GuidanceShare पर लोगों को इस तरह की स्थिति पर अच्छी तरह से चर्चा करें। संक्षेप में:

  • यदि आवश्यक हो तो अधिकतमRequestLength बढ़ाएं, जैसा कि आपने चर्चा की है।
  • स्ट्रीमिंग लागू करने पर विचार करें। .NET 1.1 में, क्लास-साइड कोड में IList को लागू करने वाली कक्षा का उपयोग करें, और क्लाइंट-साइड कोड में HttpContext.Current.Response.BufferOutput=false; सेट करें। .NET स्वचालित रूप से सूची के तत्वों को एक-एक करके भेज देगा, इसलिए सूची का प्रत्येक तत्व बाइट्स का 1K बफर हो सकता है।
  • यदि आप .NET 2 या ऊपर का उपयोग कर सकते हैं, तो डब्ल्यूसीएफ पर विचार करें। यह HTTP बाइंडिंग के लिए स्वचालित रूप से स्ट्रीमिंग लागू करता है।

ठीक है, कि एक रेड हेरिंग तो है! टिप्पणियों के लिए धन्यवाद, ऐसा लगता है कि मैं गलत हूं।

+0

हाय। एमएसडीएन को देखते हुए यह कहता है कि डिफ़ॉल्ट 4096 (4 एमबी) है ... यह कहता है कि यह किलोबाइट्स में है .. msdn.microsoft.com/en-us/library/... क्या यह गलत है? – CraftyFella

+0

यह भी विकास और हमारे परीक्षण पर्यावरण पर ठीक काम करता है, जो बहुत अजीब है! – CraftyFella

+0

MaxRequestLength किलोबाइट्स में है। – OrionRobillard

1

मुझे नहीं लगता कि यह maxRequestLength के कारण हो सकता है। यह कोड FileStream.Write के बीच में है, डेटा प्राप्त करने के किसी भी प्रश्न से बहुत लंबा है। डीबगर में डेटा। लम्बाई को देखकर इसकी पुष्टि करें।

आपके पास WebMethod (सत्य) क्यों है? बस [WebMethod] आज़माएं और देखें कि क्या होता है।

+0

हाय, हाँ मैंने पुष्टि की है कि सर्वर डेटा प्राप्त कर रहा है ठीक है। मैं प्राप्त किए गए बाइट्स की पुष्टि करने के लिए क्लाइंट द्वारा पिछले बाइट्स के समान ही वास्तविक लाइव संस्करण में चेक योग में पास करता हूं। मैं webMethod सुझाव का प्रयास करूंगा और आपको वापस ले जाऊंगा। धन्यवाद – CraftyFella

+0

बीटीडब्लू ... बस [webmethod] का उपयोग करके कुछ भी नहीं बदला। – CraftyFella

0

WriteAllBytes डिस्क पर लिखने से पहले पूरी फ़ाइल को रैम में लोड करता है। आप स्मृति से बाहर हो रहे हैं।

3

मैं जानता हूँ कि आप फ़ाइल के इस आकार तक नहीं पहुँच रहे, लेकिन यह भी ध्यान रखें जब नेटवर्क पथ के लिए लिख File.WriteAllBytes 64MB की एक सीमा होती है कि हो सकता है - देखना यह connect issue

+0

धन्यवाद .. मैं उनके सुझाए गए कामकाज का प्रयास करूंगा और आपको वापस ले जाऊंगा .. स्ट्रिंग पथ = "\\ सर्वर \ शेयर \ myfile.pdf"; स्ट्रिंग tempPath = Path.GetTempFileName() + "।" + पथ। गेट एक्सटेंशन (पथ); File.WriteAllBytes (tempPath, फ़ाइल); फ़ाइल.मोव (tempPath, पथ); क्योंकि मुझे इस मुद्दे का उत्तर प्राप्त करने में सक्षम होना अच्छा लगेगा। :-) डेव – CraftyFella

3

मैं जब फ़ाइल का उपयोग कर एक समान त्रुटि संदेश प्राप्त किया गया था .WriteAllBytes और नीचे दिए गए उदाहरण में फ़ाइलस्ट्रीम का उपयोग करने के लिए अपना कोड बदल दिया। दूसरों की टिप्पणियों के आधार पर, मेरा अनुमान है कि फ़ाइलस्ट्रीम का एक छोटा स्मृति प्रभाव है।

 using (FileStream stream = new FileStream(FilePath, FileMode.Create, FileAccess.ReadWrite)) 
     { 
      stream.Write(Data, 0, Data.Length); 
      stream.Close(); 
     } 
+0

यह अपवाद के साथ बहुत अच्छा काम करता है कि मुझे स्रोत 'बाइट [] 'सरणी को पहले पढ़ने के लिए' मेमोरीस्ट्रीम 'का उपयोग करना था और फिर इसे टुकड़ों में पाइप करना था। 'मेमोरीस्ट्रीम' स्रोत का उपयोग करके [इस चंकिंग उदाहरण] का पालन किया गया है (http://stackoverflow.com/a/12468420/175679)। मेरे मामले में, आईआईएस 20 एमबी + फाइलों के साथ नेटवर्क शेयर पर लिखते समय इस 'आईओएक्सप्शन' को फेंकता है। – SliverNinja

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