2011-07-01 47 views
2

我已實施類似this 唯一不同的事情是C#:HttpListener錯誤內容供應

string filename = context.Request.RawUrl.Replace("/", "\\").Remove(0,1); 
string path = Uri.UnescapeDataString(Path.Combine(_baseFolder, filename)); 

,這樣我可以遍歷子目錄。這對網頁和其他文本文件的類型,但偉大工程,努力成爲了媒體內容我得到的異常時

HttpListenerException:在I/O 操作已中止,因爲 線程退出或應用程序 要求

其次

出現InvalidOperationException:不能,直到所有字節寫入關閉流。

在using語句中。

關於如何處理這個問題或停止這些異常的建議?

感謝

+0

是否有可能在所有內容發送之前調用Stop()?你的調用代碼是怎樣的? –

+0

我從不叫停,甚至在發生這些異常之後,我發現它們仍然在傳遞內容。問題在於瀏覽器不斷請求文件並導致文件緩慢下降。我再次在音樂文件和視頻文件中發現這個問題。調用代碼正在創建一個以「http:// *:8080 /」作爲前綴的新Web服務器,然後調用start。沒有做任何線程或任何事情,所以它只是在開始時陷入循環。 – Pieces

回答

1

我要指出,我使用谷歌Chrome瀏覽我的瀏覽器(谷歌瀏覽器似乎並不關心MIME類型,當它看到音頻它會嘗試像在HTML5播放器中那樣使用它),但是如果您嘗試在頁面中託管媒體內容,這也適用。

無論如何,我正在用提琴手檢查我的標題,並注意到Chrome向服務器傳遞了3個請求。我開始和其他瀏覽器一起玩,並且注意到他們沒有這樣做,但是根據瀏覽器和我硬編碼爲MIME類型的內容,我會得到一個瘋狂的文本頁面或下載文件。

經進一步檢查,我注意到chrome會先請求文件。然後用幾個不同的標題再次請求文件,最顯着的是範圍標題。第一個字節= 0,然後下一個大小不同的文件取決於文件的大小(可以根據文件的大小進行多於3個請求)。

所以出現了這個問題。 Chrome會先請求文件。一旦看到該類型,它會發送另一個請求,看起來我在尋找文件有多大(byte = 0-),然後另一個請求文件的後半部分或類似的東西,以允許在使用時經歷的某種流式傳輸HTML5。我編寫的東西很快,以處理MIME類型,並與音頻組件一起扔了HTML5網頁,發現其他瀏覽器也這樣做(除了IE)

因此,這裏是一個快速的解決方案,我不再得到這些錯誤

string range = context.Request.Headers["Range"]; 
int rangeBegin = 0; 
int rangeEnd = msg.Length; 
if (range != null) 
{ 
    string[] byteRange = range.Replace("bytes=", "").Split('-'); 
    Int32.TryParse(byteRange[0], out rangeBegin); 
    if (byteRange.Length > 1 && !string.IsNullOrEmpty(byteRange[1])) 
    { 
     Int32.TryParse(byteRange[1], out rangeEnd); 
    } 
} 

context.Response.ContentLength64 = rangeEnd - rangeBegin; 
using (Stream s = context.Response.OutputStream) 
{ 
    s.Write(msg, rangeBegin, rangeEnd - rangeBegin); 
} 
0

嘗試:

using (Stream s = context.Response.OutputStream) 
{ 
     s.Write(msg, 0, msg.Length); 
     s.Flush()    
} 
+0

仍在發生。 I/O異常發生在s.Write中 – Pieces