2009-04-27 39 views
6

HttpListener cung cấp cho bạn luồng phản hồi, nhưng việc gọi tính năng tuôn ra có nghĩa là không có gì (và từ các nguồn rõ ràng, bởi vì nó thực sự không làm gì cả). Việc đào sâu bên trong HTTP API cho thấy rằng đây là một hạn chế của chính HttpListener.Làm cách nào để xóa luồng phản hồi của HttpListener?

Bất kỳ ai biết chính xác cách xả luồng phản hồi của HttpListener (có thể có phản chiếu hoặc P/Invokes bổ sung)?

Cập nhật: Bạn không thể http truyền bất cứ điều gì nếu bạn không có tùy chọn tuôn ra hoặc khả năng xác định kích thước bộ đệm.

Trả lời

2

Làm sạch chỉ hoạt động trong hầu hết không gian tên System.Net khi Chuyển mã hóa được đặt thành Chuncked, nếu không toàn bộ yêu cầu được trả về và Flush thực sự không làm gì cả. Ít nhất đây là những gì tôi đã có kinh nghiệm trong khi làm việc với HttpWebResponse.

+0

Câu hỏi không phải là TẠI SAO nó không hoạt động ... Nhưng hãy tưởng tượng http phát trực tuyến, điều quan trọng là gửi nội dung sớm nhất có thể. Dữ liệu chunked không phải là một tùy chọn ở đây cả. HttpListener thực sự gửi một cái gì đó TRƯỚC KHI bạn đã hoàn thành yêu cầu, nhưng nó sử dụng bộ đệm không thể cấu hình khá lớn. – Mash

+0

Và btw, ASP.NET flushes ok khi bạn đang yêu cầu nó ... ASP.NET yêu cầu một số hacks để có được nội dung InputStream trước khi POST toàn bộ cơ thể đã được lấy ra, nhưng OutputStream hoạt động ok. – Mash

+1

HTTP không thực sự là giao thức truyền trực tuyến. Nó có nghĩa là để truyền tải văn bản qua internet, do đó giao thức truyền siêu văn bản tên. Nếu bạn muốn streaming tôi sẽ đề nghị một ổ cắm. Hoặc điều gì đó tốt hơn một chút khi phát trực tuyến nội dung trong các gói nhỏ đủ để bạn kiểm soát. –

0

Tôi chưa thử điều này, nhưng cách viết một máy chủ TCP riêng biệt để phát trực tuyến phản hồi? Sau đó chuyển tiếp yêu cầu từ HttpListener đến máy chủ tcp "nội bộ". Sử dụng chuyển hướng này, bạn có thể truyền lại dữ liệu khi cần.

Như để xả nó, họ chỉ cách tôi thấy để làm điều đó là để mô phỏng một xử lý, mà không thực sự xử lý. Nếu bạn có thể xâm nhập vào đối tượng HttpResponseStream, hãy yêu cầu nó hủy bỏ, bỏ cờ m_Closed, v.v., bạn có thể xóa dữ liệu trực tuyến.

+0

Viết máy chủ TCP riêng biệt? Tốt hơn hết là viết tất cả mọi thứ với TcpListener (nhanh hơn .NET Sockets), nhưng chậm hơn nhiều so với HttpListener. Tôi sẽ kiểm tra các nguồn vứt bỏ, nhưng imho không đúng cách. Cho dù tuôn ra hay không trong http.sys được định nghĩa với chính gói dữ liệu. – Mash

Các vấn đề liên quan