2013-08-02 4 views
3

HttpListener를 기반으로하는 작은 로컬 웹 서버가 있습니다. 서버는 거대 나는 항상 출력 스트림에 모든 파일 바이트를 복사하는 것은 좋은 생각 (메모리) 생각하지 않는 파일 (동영상)을 풀고 때로는응답 출력 스트림에 데이터를 쓰는 HttpListener

response.OutputStream; 

하지만 파일을 작성 로컬 클라이언트 응용 프로그램에 파일을 제공합니다 . 나는이 같은 응답 출력 스트림 뭔가에 제공 파일 스트림을 연결하고 싶습니다 :

response.OutputStream = myFileStream; 

하지만 -ok- response.OutputStream은 그래서 난 그냥 바이트를 쓸 수 읽기 - (부분 쓰기의 어떤 종류를 만들 수있는 방법이있다 스트리밍)?

감사합니다.

+1

이 ... 당신은 스트리밍 연결을 만들려고, 다음 단계는 것 파일을 개별 패키지로 나눠서 동시에 전송하고 클라이언트 측에서 다시 구성하십시오 ... 왜 그렇게하지 않습니까? –

+0

제공되는 비디오 파일은 웹 브라우저 (gecko fx)에 표시되고 비디오 (mp4) 요청이 오면 (html5

답변

2

스레드를 생성하고 데이터를 응답으로 스트리밍해야합니다. 이 같은 사용 무언가 : 주 스레드에서

: 클래스 어딘가에

while (Listening) 
{ 
    // wait for next incoming request 
    var result = listener.BeginGetContext(ListenerCallback, listener); 
    result.AsyncWaitHandle.WaitOne(); 
} 

: 그래서

public static void ListenerCallback(IAsyncResult result) 
{ 
    var listenerClosure = (HttpListener)result.AsyncState; 
    var contextClosure = listenerClosure.EndGetContext(result); 

    // do not process request on the dispatcher thread, schedule it on ThreadPool 
    // otherwise you will prevent other incoming requests from being dispatched 
    ThreadPool.QueueUserWorkItem(
     ctx => 
     { 
      var response = (HttpListenerResponse)ctx; 

      using (var stream = ...) 
      { 
       stream.CopyTo(response.ResponseStream); 
      } 

      response.Close(); 
     }, contextClosure.Response); 
} 
+1

여기 비슷한 게시물 (더 많은 컨텍스트를 가지고) : http://stackoverflow.com/questions/13385633/serving-large-files-with-c-sharp-httplistener?rq=1 –

+1

나는 그 stream.CopyTo (response. ResponseStream) 모든 파일 바이트를 출력 스트림에 복사하면 이것이 피하고 싶습니다. – UGEEN

+1

UGEEN .AllowWriteStreamBuffering 속성을 false로 설정하면 로컬에서 아무 것도 캐시하지 않습니다. 클라이언트가 수신을 중지하면 전송이 중지됩니다. –

관련 문제