2009-04-27 2 views
6

HttpListener는 응답 스트림을 제공하지만 flush를 호출하면 아무런 의미가 없습니다. 실제로는 아무것도 수행하지 않으므로 소스에서 알 수 있습니다. HTTP API 내부를 파고 들면 HttpListener 자체의 제한 사항임을 알 수 있습니다.HttpListener 응답 스트림을 플러시하는 방법은 무엇입니까?

누구나 HttpListener (반사 또는 추가 P/Invokes가있을 수 있음)의 응답 스트림을 플러시하는 방법을 정확히 알고 있습니까?

업데이트 : 플러시 옵션이나 버퍼 크기 정의 기능이없는 경우 http 스트림을 스트리밍 할 수 없습니다.

답변

2

플러시는 Transfer-Encoding을 Chuncked로 설정하면 대부분의 System.Net 네임 스페이스에서만 작동합니다. 그렇지 않으면 전체 요청이 반환되고 Flush는 실제로 아무 작업도 수행하지 않습니다. 적어도 이것은 HttpWebResponse로 작업하면서 경험 한 것입니다.

+0

질문은 작동하지 않습니다 ...하지만 가능한 빨리 뭔가를 보내는 것이 중요한 경우 http 스트리밍을 상상해보십시오. 청크 데이터는 여기에 옵션이 아닙니다. 요청을 완료하기 전에 실제로 뭔가를 보내는 HttpListener,하지만 꽤 큰 구성 할 수없는 버퍼를 사용하고 있습니다. – Mash

+0

그리고 btw, ASP.NET은 요청할 때 확인을 내립니다. ASP.NET은 전체 POST 본문이 검색되기 전에 InputStream 내용을 얻기 위해 몇 가지 해킹이 필요하지만 OutputStream은 정상적으로 작동합니다. – Mash

+1

HTTP는 실제로 스트리밍 프로토콜이 아닙니다. 이것은 인터넷을 통해 텍스트를 전송하기위한 것이며, 따라서 이름 하이퍼 텍스트 전송 프로토콜입니다. 스트리밍을 원하면 소켓을 제안 할 것입니다. 또는 콘텐트를 제어 할 수있는 작은 패킷으로 스트리밍하는 것이 조금 더 낫습니다. –

0

아직 시도하지는 않았지만 스트리밍 응답을위한 별도의 TCP 서버를 작성하는 것이 어떻습니까? 그런 다음 HttpListener에서 "내부"tcp 서버로 요청을 전달하십시오. 이 리디렉션을 사용하면 필요할 때 데이터를 다시 스트리밍 할 수 있습니다.

플러싱에 관해서는, 실제로 볼 수있는 유일한 방법은 실제로 처분하지 않고 처분을 시뮬레이션하는 것입니다. HttpResponseStream 객체를 해킹 할 수 있다면, 그것을 처리하거나, m_Closed 플래그를 해제하는 등, 스트리밍 데이터를 플러시 할 수 있습니다.

+0

별도의 TCP 서버 작성 중입니까? TcpListener (.NET 소켓보다 빠름)로 모든 것을 작성하는 것이 좋지만 HttpListener보다 훨씬 느립니다. 처분 소스를 확인 하겠지만 올바른 방법은 아닙니다. 데이터 패킷 자체로 정의 된 http.sys에서 플러시할지 여부. – Mash

관련 문제