2013-08-02 50 views
3

我有一個基於HttpListener小型本地Web服務器。服務器提供文件本地客戶端應用程序解包和文件寫入HttpListener將數據寫入響應輸出流

response.OutputStream; 

但有時文件(視頻)是巨大的,我不認爲這是一個好主意,總是複製所有文件的字節到輸出流(內存) 。我想提供文件流連接響應輸出流是這樣的:

response.OutputStream = myFileStream; 

但-ok- response.OutputStream是隻讀的,所以我只可以寫字節 - 有什麼辦法做出某種局部寫作(流)?

問候。

+1

所以......你要創建一個信息流連接,下一步將是將文件分割成單獨的包並同時發送,並在客戶端重新構建它們......爲什麼不這樣做? –

+0

投放的視頻文件顯示在Web瀏覽器(壁虎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(響應。 ResponseStream)將所有文件字節複製到輸出流,這就是我想要避免的。 – UGEEN

+1

UGEEN,如果將.AllowWriteStreamBuffering屬性設置爲false,則它不會在本地緩存任何內容。當客戶端停止接收時,它將停止發送。 –