2012-11-29 22 views
7

बंद करना हमारे पास एक आरईएसटी एपीआई है, जिसे डब्ल्यूसीएफ के साथ बनाया गया है।स्ट्रीम का उपयोग करते समय गलत वेबफॉल्ट अपवाद और स्ट्रीम

हम सभी अपवादों को इस तरह WebFaultException साथ बैकेंड संभाल:

throw new WebFaultException<string>(e.Message, HttpStatusCode.NotAcceptable); 

यह एक स्थिति में छोड़कर बस ठीक काम करता है जहां हम एक पोस्ट करते हैं, एक धारा के साथ।

इस का एक उदाहरण:

[WebInvoke(Method = "POST", UriTemplate = "saveUser?sessionId={sessionId}&userId={userId}", 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json,    
     BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
    [OperationContract] 
    string SaveUser(string sessionId, int userId, Stream stream); 

जब एक कथन का उपयोग में इस स्ट्रीम से निपटने, जब भी हम तो एक अपवाद हम बार आ रही है में चलाने:

फ़िडलर से:

HTTP/1.1 400 Bad Request 
    <p>The server encountered an error processing the request. The exception message is 'The message object has been disposed.'. See server logs for more details. The exception stack trace is: </p> 
    <p> at System.ServiceModel.Channels.ByteStreamMessage.InternalByteStreamMessage.get_Properties() 
    at System.ServiceModel.OperationContext.get_IncomingMessageProperties() 
    at System.ServiceModel.Dispatcher.WebErrorHandler.ProvideFault(Exception error, MessageVersion version, Message&amp; fault)</p> 

ऐसा लगता है कि इसमें स्ट्रीम और स्ट्रीम रीड के साथ कुछ करना है er का निपटारा किया जा रहा है।

मैंने स्ट्रीमरडर को निपटाने के लिए कुछ भी करने की कोशिश की है, और यह अकल्पनीय काम करता है। कोड अब इस से निपटने के इस तरह दिखता है:

enter image description here

यह सही अपवाद संदेश भेजने में समस्या का हल है, लेकिन कितना बुरा यह हमारे आवेदन को प्रभावित करेगा, बंद करने या हमारे StreamReader निपटान नहीं? क्या आप इसे हल करने के किसी अन्य तरीके को देखते हैं?

उत्तर

7

ऐसा इसलिए होता है क्योंकि StreamReader स्ट्रीम के 'स्वामित्व' को लेता है। दूसरे शब्दों में, यह स्रोत स्ट्रीम को बंद करने के लिए खुद को जिम्मेदार बनाता है। जैसे ही आपका प्रोग्राम कॉल या बंद कर देता है (आपके मामले में उपयोग कथन का दायरा छोड़कर) तो यह स्रोत स्ट्रीम को भी निपटान करेगा। कॉलिंग sr.Dispose() अपने मामले में। तो फ़ाइल स्ट्रीम के बाद मर चुका है।

यदि आप यह नहीं चाहते हैं तो आप StreamReader से विरासत में प्राप्त एक नई कक्षा बना सकते हैं और बंद विधि को ओवरराइड कर सकते हैं; अपनी बंद विधि के अंदर, निपटान (झूठी) को कॉल करें जो स्ट्रीम को बंद नहीं करता है।

आप जॉन स्कीट की MiscUtil लाइब्रेरी से NonClosingStreamWrapper कक्षा का भी उपयोग कर सकते हैं, यह वास्तव में उस उद्देश्य को कार्य करता है।

लेकिन स्ट्रीमर को बिना किसी निपटारे के छोड़ना बेहतर होगा क्योंकि यह किसी भी अप्रबंधित संसाधनों को साफ नहीं कर सकता है।

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