2012-12-19 20 views
23

Stream türünde bir parametresi olan bir yöntemle bir hizmet arabirim var. Bu akıştan tüm verileri okuduktan sonra akışı kapatmalı mıyım yoksa yöntem çağrısı tamamlandığında WCF Çalışma Zamanı tarafından mı yapıldı?WebInvoke akışını kapatmak için gerekli

Gördüğüm en çok örnek, yalnızca verileri akıştan okuyor, ancak Akışı Kapat veya At'ı çağırmıyor.

Normalde, derenin, akımın sahibi olmadığı için akışı kapatmam gerektiğini söyleyebilirim, ancak neden şu soruyu sormamızın nedeni, şu anda sistemimizde bir sorunu araştırmamızın, bazılarının Bu hizmete veri göndermek için HTTP-Post kullanan Android İstemcileri, bazen kapalı olmayan açık bağlantılara sahiptir (ESTABLISHED Tcp bağlantılarını listeleyen netstat ile analiz edilmiştir).

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

Bunu% 100 emin olmadığım için yorum olarak ekliyorum. Diğer tarafın size geri göndermeden önce kapatamadığı için, "Akışı" kapatmanız gerektiğini düşünüyorum. Bunu anladım - söylediğin gibi - karşı sezgisel. Ayrıca, açık bir tcp bağlantısının bir "Stream" açık olmasıyla ilgili olduğunu sanmıyorum ... kapanmış olabilir. – pleinolijf

+4

@albertjan Bu şekilde yorum yazmanın bir sebebi var mı yoksa sadece bütün cümlelere yazamıyor musunuz? Anlamıyorum ne demek istiyorsun. Lütfen detaylandırır mısınız? – seba

cevap

2

kapanış davranışını denetler veya parametreyi kapanmayan OperationBehaviorAttribute.AutoDisposeParameters özelliktir ve gerçek varsayılan davranışı ile sapma için kullanılabilir özellik Bağlama Hizmet

[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; 
    } 

Yapılandırma/yöntemden çıktıktan sonra Stream parametresinin kapalı olmasıyla ilgilidir. Çoğu zaman parametrenin açık kapanışını görmemenizin nedeni budur. Varsayılan davranışı geçersiz kılmak istiyorsanız, OperationCompleted olayıyla açık denetimi ve close the Stream once the operation has completed'u alabilirsiniz.

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; 
} 

, müşterilere Stream için kendiStream kopyasını değil, bir referans alıyorsanız unutmayın ve böylece kapatmadan sorumludur.