2009-10-02 60 views
3

長期以來流錄入數據庫的圖片現在就涉及到我的本地計算機上錄入數據庫圖像的Web應用程序項目時,我已經發現了一些惱人的。就本地而言,我的意思是這是在我的工作站上使用VS 2008和SQL Server 2005的典型環境。每當我使用HttpHandler在本地顯示圖像時,只有一些圖像在每個頁面上呈現。使用的HttpHandler

然而,當我推應用程序託管環境中,問題通常會消失。但是,我只是將一個新項目推送到託管環境,並遇到了與本地相同的問題 - 這次該站點和數據庫位於託管環境中的同一臺服務器上。有沒有人知道這裏發生了什麼?

這裏的處理程序:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class FeaturedHandler : IHttpHandler 
{ 
    Business biz = new Business(); 

    public void ProcessRequest(HttpContext context) 
    { 
     if (context.Request.QueryString["ListingID"] != null) 
     { 
      int listingID = Convert.ToInt32(context.Request.QueryString["ListingID"]); 

      DataSet ds = biz.GetFeaturedImageByID(listingID); 
      DataRow row = ds.Tables[0].Rows[0]; 
      byte[] featureImage = (byte[])row["Photo"]; 
      context.Response.ContentType = "image/jpeg"; 
      context.Response.OutputStream.Write(featureImage, 0, featureImage.Length); 
     } 
     else 
      throw new ArgumentException("No ListingID parameter specified"); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

我一直在使用一個單獨的服務器上的數據庫嘗試,但遇到同樣的問題。我應該使用DataReader嗎?

UPDATE 因爲我正在讀取二進制數據,所以最初我應該使用DataReader。

+1

可能相關:http://stackoverflow.com/questions/5500950/what-is-the-use-for-ihttphandler-isreusable – 2011-03-31 17:24:08

回答

3

我終於得到了所有圖像通過改變IsReusable屬性的值來渲染真正

public bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 

顯然,這保持了處理程序在內存中,並且能夠處理多個請求。當設置爲false時,它必須爲每個傳入請求創建一個處理程序的新實例。

+0

Doh!我不敢相信我們錯過了這一點。我總是將「IsReusable」設置爲true。我甚至沒有在你的代碼中看它。恭喜找到解決方案。 – 2009-10-09 15:21:20

+0

我真的很想知道如何在這種情況下將「IsReusable」設置爲true。不應該有新的處理程序總是能夠提供圖像嗎?這裏的示例是流動動態大小的圖像,並將「IsReusable」設置爲false:http://www.c-sharpcorner.com/UploadFile/desaijm/HTTPHandlersForImages11152005062705AM/HTTPHandlersForImages.aspx – Leif 2013-01-31 09:48:39

+0

永遠無法在此屬性的MSDN上找到適當的文檔,並且只能通過測試觀察... – IrishChieftain 2013-01-31 14:44:06

0

如果直接提供圖片,不要忘記設置正確的緩存頭,即ETag的和過期。如果你不這樣做,你真的會打你的數據庫並耗盡你的帶寬。

您需要處理以下HTTP標頭:

  • ETag的
  • 過期
  • 的Last-Modified
  • 的if-match
  • 如果 - 無 - 匹配
  • 如 - 修改 - 自
  • 如果 - 未修改 - 自
  • 除非-Modified-Since的

對於例如HTTP處理程序做這個檢查: http://code.google.com/p/talifun-web/wiki/StaticFileHandler

1

通過這樣的:

每當我使用一個HttpHandler 顯示器上的圖像我的本地,只有一個 部分的圖像呈現在每個頁面上加載 。

你的意思是相同的圖像能顯示在不同的圖像應該出現的地方,或某些圖像出現,一些不顯示呢?

在您的情況下,將isReusable切換爲true的差異在於new Business();將被調用一次用於多個圖像。如果isReusable爲假,則每個圖像將調用new Business();一次。這意味着如果您每頁有幾張圖片,new Business();將在這個特定頁面被多次調用。

此外,我強烈建議改變這個:

if (context.Request.QueryString["ListingID"] != null) 
{ 
    int listingID = Convert.ToInt32(context.Request.QueryString["ListingID"]); 

有:

string listingIdParam = context.Request.QueryString["ListingID"]; 
if (listingIdParam != null) 
{ 
    int listingID = Convert.ToInt32(listingIdParam); 

這將節省您空引用異常,通常僅表面負載。此外,上述內容將防止向請求提供錯誤的圖像,尤其是在isReusable爲true時。

我不能確定問題是什麼,但我可以肯定地說,設置isReusable標誌只是一種解決方法,並不能解決您的問題。此外,如果像這樣的問題只能在特定的環境中重現,這意味着它或者是線程問題,或者請求處理(不同的Web服務器 - IIS6,IIS7,開發服務器)有一些差異。

也許發佈Business類,它的構造函數可以揭示一些光。 另外我建議實施某種錯誤日誌記錄來捕獲處理程序中的異常並對其進行檢查。

+0

偉大的投入Branislav。一些照片根本不會呈現。今晚我會搜索原始代碼並在此發佈,謝謝:) – IrishChieftain 2011-03-31 16:42:22

+0

Branislav,我查了一下代碼。顯然,當我將DataSet換出DataReader時,我已經取消了對業務類的調用 - 對於讀取二進制數據更有意義嗎?我在內部編寫了SQL查詢。這似乎解決了這個問題。 – IrishChieftain 2011-04-10 01:00:13