2011-06-06 63 views
2

由於一些奇怪的原因,一個五年的內部asp.net網絡應用程序通過IE6使用突然出現問題,即使沒有代碼的變化。某些用戶不會看到正在流式傳輸到Web瀏覽器的某些圖像。如何流式傳輸字節數組圖像?

我不知道爲什麼這個突然開始發生或者原因是什麼 - 不過作爲搜索的一部分,我正在考慮用於流式傳輸圖像的代碼是否存在缺陷。

圖像保存在內存中是一個字節數組,然後使用以下代碼進行流式傳輸。這是流式傳回圖像的最佳方式嗎?

Response.Clear(); 
Response.ClearHeaders(); 
Response.ClearContent();   

// Work out file type 
switch(Path.GetExtension(imageFilename).ToLower()) 
{ 
    case ".jpg": 
    case ".jpeg": 
     Response.ContentType = "image/jpeg"; 
     break; 
    case ".gif": 
     Response.ContentType = "image/gif"; 
     break; 
    default: 
     Response.ContentType = "binary/octet-stream"; 
     break; 
} 

Response.AddHeader("Content-Length", imageBytes.Length.ToString()); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.BinaryWrite(imageBytes); 
Response.End(); 

不是在頁面中顯示圖像,而是顯示紅色十字。這隻發生在頁面上顯示的動態生成的圖像上,而不是靜態鏈接的圖像。

如果我嘗試在自己的窗口中打開圖像,我會看到圖像或一大堆gobbledygook文本(我猜這意味着MIME類型沒有被瀏覽器設置/拾取)

+0

乍一看似乎是合適的,但你能概述一下你的客戶有哪些「問題」?這是全部圖像還是僅僅是一些?隨機?他們是下載這些圖像還是嵌入父頁? – Mantorok 2011-06-06 12:44:39

+0

當圖像沒有出現時,你會得到什麼樣的位置?空白,紅-X等? – 2011-06-06 12:58:34

+0

@Mantorok @Damien_The_Unbeliever我已經用澄清更新了原始問題。 – 2011-06-06 13:56:13

回答

1

Response.End()通常是不好的,因爲它會中止IIS線程,即使它處於Flush()中間。

使用Response.Flush()後跟Response.Close()以確保所有內容都發送到客戶端。

+0

我已經更新了這些'Response.Flush(); Response.Close()'而不是'Response.End()' - 不幸的是它給出了相同的結果 – 2011-06-07 13:53:45

+0

@Peter檢查IIS設置沒有改變 - 特別是我記得使用HTTP壓縮時的問題,因爲這會破壞我們的一些流的東西。 – Leon 2011-06-07 15:08:28

0

我可能是錯誤的這一個,但我認爲Content-Length應包含字節的身體的長度。 Response.BinaryWrite將base64編碼的數據,這將是更長,然後你告訴它的長度爲byte[]在頭。

+0

嗯,由於只有一些客戶有這個問題似乎不太可能,但你的答案肯定會提出一個很好的問題!我現在好奇自己。 – Mantorok 2011-06-06 12:53:51

+0

'.BinaryWrite'是'.OutputStream.Write'的包裝,可以正確地用於傳輸二進制數據。它不執行任何編碼。作爲@Damien_The_Unbeliever正確地指出該響應不會被編碼,所以 – 2011-06-06 12:57:21

+0

。所以我的整個答案是不正確的。 – 2011-06-06 18:17:27