2013-10-16 72 views
0

目前,我有一個用戶可以在其中播放MP3文件的ASP.NET網站上的功能。該代碼看起來是這樣的:在ASP.NET上流式傳輸MP3塊

Response.Clear(); 
Response.ContentType = "audio/mpeg"; 

foreach (DataChunk leChunk in db.Mp3Files.First(mp3 => mp3.Mp3ResourceId.Equals(id)).Data.Chunks.OrderBy(chunk => chunk.ChunkOrder)) 
{ 
    Response.BinaryWrite(leChunk.Data); 
} 

不幸的是,如果選擇一個較大的MP3文件,音頻沒有開始播放,直到整個文件被下載,這可能會導致明顯的延遲。即使整個文件可能尚未傳輸,是否有任何方法讓MP3立即開始播放?

+0

這可能有助於HTTP://計算器。com/questions/9600856/how-to-deliver-big-files-in-asp-net-response – cem

回答

0

在流式傳輸響應之前嘗試設置Response.BufferOutput = false。

+0

將該值設置爲false將導致「遠程主機關閉連接,錯誤代碼爲0x800703E3」。 – GWLlosa

0

如果MP3文件的位置是公開提供給您的用戶,然後另一種方法可能是剛剛回歸MP3的URL並使用標記中的HTML 5音頻標籤來播放音樂。我很確定音頻標籤的默認行爲是流式傳輸文件,而不是等到整個文件下載完成。

1

試試這個:

Response.BufferOutput = false; //sets chunked encoding 
    Response.ContentType = "audio/mpeg"; 

    using (var bw = new BinaryWriter(Response.OutputStream)) 
    { 
     foreach (DataChunk leChunk in db.Mp3Files.First(mp3 => mp3.Mp3ResourceId.Equals(id)).Data.Chunks.OrderBy(chunk => chunk.ChunkOrder)) 
     { 
      if (Response.IsClientConnected) //avoids the host closed the connection exception 
      { 
       bw.Write(leChunk.Data); 
      } 
     } 
    } 

此外,去喲你的web.config文件,並做到這一點,如果你仍然有塊編碼問題:

<system.webServer> 
    <asp enableChunkedEncoding="true" /> 
</system.webServer> 

你上面關於主機報告的錯誤正在關閉連接的情況可能是因爲您使用瀏覽器打開網頁,而當瀏覽器讀取內容類型時,它會打開媒體播放器並關閉自己,然後關閉打開的連接,導致該錯誤,因此要避免這個,你需要檢查pe不管你的客戶是否仍然連接,

最後,如果您使用aspx頁面來避免網頁不必要的開銷,我會使用通用處理程序(.ashx)或自定義處理程序,併爲此設置一個.mp3擴展名。

我希望這會有所幫助。

0

支持此方法的一種方法是實現HTTP字節範圍請求。

默認情況下,我不相信ASP.NET會這樣做,如果在問題或答案中使用任何代碼,肯定不會。

雖然您可以通過一些工作手動實現此功能。另一個選擇,這將是更少的開發工作,將讓IIS服務於一個靜態文件。我認爲這不是一個選項。

下面是一個示例實現: http://www.codeproject.com/Articles/820146/HTTP-Partial-Content-In-ASP-NET-Web-API-Video