2012-12-19 36 views
23

स्ट्रीम को बंद करना आवश्यक है मेरे पास एक विधि के साथ एक सेवा इंटरफ़ेस है जिसमें Stream प्रकार का पैरामीटर है। क्या मुझे इस स्ट्रीम से सभी डेटा पढ़ने के बाद स्ट्रीम बंद करनी चाहिए या क्या यह विधि कॉल पूरा होने पर डब्ल्यूसीएफ रनटाइम द्वारा किया जाता है?क्या वेब इनवोक विधि

मैंने जो उदाहरण देखा है, केवल स्ट्रीम से डेटा पढ़ते हैं, लेकिन स्ट्रीम पर बंद या निपटान न करें।

आम तौर पर मैं कहूंगा कि मुझे धारा बंद करने की आवश्यकता नहीं है क्योंकि कक्षा धारा का मालिक नहीं है, लेकिन यही कारण है कि यह सवाल यह है कि हम वर्तमान में हमारे सिस्टम में एक समस्या की जांच कर रहे हैं, कि कुछ एंड्रॉइड क्लाइंट्स, जो इस सेवा में डेटा भेजने के लिए HTTP-Post का उपयोग करते हैं, कभी-कभी खुले कनेक्शन होते हैं जो बंद नहीं होते हैं (netstat के साथ विश्लेषण जो सूचीबद्ध Tcp कनेक्शन सूचीबद्ध करता है)। सेवा की

[ServiceContract] 
public interface IStreamedService { 
    [OperationContract] 
    [WebInvoke] 
    Stream PullMessage(Stream incomingStream); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, UseSynchronizationContext = false)] 
public class MyService : IStreamedService { 

    public System.IO.Stream PullMessage(System.IO.Stream incomingStream) { 
     // using(incomingStream) { 
     // Read data from stream 
     // } 

     Stream outgoingStream = // assigned by omitted code; 
     return outgoingStream; 
    } 

विन्यास/

<webHttpBinding> 
    <binding name="WebHttpBindingConfiguration" 
      transferMode="Streamed" 
      maxReceivedMessageSize="1048576" 
      receiveTimeout="00:10:00" 
      sendTimeout="00:10:00" 
      closeTimeout="00:10:00"/> 
</webHttpBinding> 
+0

इसे एक टिप्पणी के रूप में रखना, क्योंकि मैं 100% निश्चित नहीं हूं। मुझे लगता है कि आपको 'स्ट्रीम' बंद करना चाहिए, क्योंकि दूसरी पार्टी इसे वापस करने से पहले इसे बंद नहीं कर सकती है। मुझे एहसास है जैसा कि आपने कहा- काउंटर-सहज ज्ञान युक्त। साथ ही, मुझे नहीं लगता कि एक खुला टीसीपी कनेक्शन 'स्ट्रीम' से खुला है ... इसे बंद किया जा सकता है। – pleinolijf

+4

@albertjan क्या कोई कारण है कि आप इस तरह से टिप्पणियां लिखते हैं या आप पूरे वाक्यों में लिखने में असमर्थ हैं? मैं समझ नहीं पा रहा हूं कि आप क्या कहना चाहते हैं। क्या आप विस्तार से बता सकते हैं? – seba

उत्तर

2

संपत्ति जो समापन के व्यवहार को नियंत्रित करता है या पैरामीटर को बंद नहीं OperationBehaviorAttribute.AutoDisposeParameters संपत्ति है और साथ सच के डिफ़ॉल्ट व्यवहार से विचलित करने के लिए इस्तेमाल किया जा सकता बाइंडिंग एक बार यह विधि से बाहर निकलने के बाद Stream पैरामीटर को बंद कर दिया जाता है। यही कारण है कि आप अक्सर पैरामीटर के स्पष्ट समापन को नहीं देखते हैं। यदि आप डिफ़ॉल्ट व्यवहार को ओवरराइड करना चाहते हैं, तो आप OperationCompleted ईवेंट के माध्यम से स्पष्ट नियंत्रण और close the Stream once the operation has completed ले सकते हैं।

public Stream GetFile(string path) { 
    Sream fileStream = null;  

    try 
    { 
     fileStream = File.OpenRead(path); 
    } 
    catch(Exception) 
    { 
     return null; 
    } 

    OperationContext clientContext = OperationContext.Current; 
clientContext.OperationCompleted += new EventHandler(delegate(object sender, EventArgs args) 
    { 
     if (fileStream != null) 
     fileStream.Dispose(); 
    }); 

     return fileStream; 
} 

ध्यान रखें कि आप ग्राहकों Stream करने के लिए अपने स्वयं के Stream की प्रतिलिपि, नहीं एक संदर्भ प्राप्त कर रहे हैं रखें और इस तरह आप इसे बंद करने के लिए जिम्मेदार हैं।