2009-04-27 15 views
6

HttpListener size yanıt akışını verir, ancak floş çağırmak hiçbir şey ifade etmez (ve kaynaklardan açıktır, çünkü aslında hiçbir şey yapmaz). HTTP API'sinin içinde arama yapmak, bunun HttpListener'ın kendisinin bir sınırlaması olduğunu gösterir.HttpListener yanıt akışı nasıl temizlenir?

HttpListener yanıt akışını tam olarak nasıl bilen herkes bilir (yansımayla veya ek P/Invokes ile olabilir)?

Güncelleme: Bir temizleme seçeneğiniz yoksa veya arabellek boyutunu tanımlayabilme yeteneğiniz yoksa http akışını http olamıyorsunuz.

cevap

2

Aktarım-Kodlama, Chuncked olarak ayarlandığında, yalnızca System.Net ad alanının çoğunda çalışır, tüm istek döndürülür ve Flush gerçekten hiçbir şey yapmaz. En azından HttpWebResponse ile çalışırken yaşadığım budur.

+0

Soru NEDEN çalışmıyor? ... Ama http akışını olabildiğince çabuk göndermenin önemli olduğunu hayal edin. Parçalanmış veriler burada bir seçenek değildir. HttpListener aslında isteği bittikten ÖNCE bir şey gönderiyor, ancak oldukça büyük yapılandırılamaz bir tampon kullanıyor. – Mash

+0

Ve btw, ASP.NET sorduğunuzda tamamıyla yanıp söner ... ASP.NET, tam POST gövdesi alınmadan önce InputStream içeriği elde etmek için bazı kesmeler gerektirir, ancak OutputStream tamam çalışıyor. – Mash

+1

HTTP gerçekten bir akış protokolü değildir. Metnin internet üzerinden iletilmesi, dolayısıyla hiper metin aktarım protokolünün adıdır. Akış istiyorsanız, bir soket öneririm. Ya da kontrol etmek için yeterince küçük paketlerde içerik akışında biraz daha iyi bir şey. –

0

Henüz denemedim, ancak yanıt akışları için ayrı bir TCP sunucusu yazmaya ne dersiniz? Ardından, isteği HttpListener'den "dahili" tcp sunucusuna iletin. Bu yönlendirmeyi kullanarak, verileri gerektiği gibi yayınlayabilirsiniz.

Yıkama sırasında, sadece imha etmeksizin bir imha simülasyonu yapmak için yaptığım gibi. HttpResponseStream nesnesine zarar verebilirseniz, m_Closed bayrağını elden çıkarmayı, imha etmeyi söyle, akış verilerinin temizlenmesini sağlayabilirsiniz.

+0

Ayrı bir TCP sunucusu yazılıyor mu? Her şeyi TcpListener ile yazmak daha iyidir (.NET Yuvaları'ndan daha hızlıdır), ancak HttpListener'dan çok daha yavaştır. İmha kaynaklarını kontrol edeceğim ama imho doğru yol değil. Veri paketinin kendisi ile tanımlanmış olan http.sys dosyasında ya da temizlenip temizlenmeyeceği. – Mash