2011-02-02 57 views
1

我目前正在運行專用服務器的網站,但希望在未來使用Microsofts Azure雲平臺進行擴展,但是我不確定我的代碼的certin部分是否可以在azure上正常工作。在Azure中生成圖像asp.net

該網站包含一個項目與每個項目的圖像庫。 圖像存儲在sqlserver數據庫中。

我創建了一個http處理程序,將圖像緩存到磁盤並將請求重定向到圖像(如帖子結尾處所示)。

圖像被保存到ASP.NET應用程序中名爲「imagecache」的虛擬目錄中。 (即〜/ imagecache /)。

由於Web應用程序將在Azure平臺上的許多虛擬機實例中運行,因此圖像需要在實例之間共享對嗎?

所以我的問題真的是..什麼是實現我已經有的最好的方式是與天青兼容?

感謝

圖片根代碼..

public class getimage : IHttpHandler { 


    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

    public void ProcessRequest (HttpContext context) { 

     try 
     { 

      string uniqueid = ""; 

      if(context.Request.QueryString["id"]) uniqueid = context.Request.QueryString["id"].ToString(); 

      string dir = "~/imagecache/"; 
      string image_target_path = dir + "image-file-" + uniqueid + ".png"; 

      byte[] data = null; 
      context.Response.ContentType = "image/png"; 

      if (!System.IO.File.Exists(context.Server.MapPath(image_target_path))) 
      { 
       if (context.Request.QueryString["id"] != null) 
       { 
        // get image data from the database 
        data = ImageHelper.getDatabaseImageDataByID(Convert.ToInt32(uniqueid)); 

        using (System.Drawing.Image img = System.Drawing.Image.FromStream(new System.IO.MemoryStream(data))) 
        { 
         // save image to disk in the virtual dir 
         img.Save(context.Server.MapPath(image_target_path)); 
        } 
       } 
       else 
       { 
        // set a sample image if no id is set 
        image_target_path = "~/images/noimage.png"; 
       } 
      } 

      // redirect request to image file 
      context.Response.Redirect(image_target_path, false); 

     } 
     catch (Exception ex) 
     { 
      log.Error(ex.Message, ex); 
     } 
    } 

    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 

} 

回答

5

這裏簡單的答案是從SQL到Azure存儲斑點移動形象店。這些blob的容器然後可以公開並通過URL訪問,而不需要您充當緩存層的中介。

但是,如果您仍然希望您的應用程序通過http處理程序充當中介,那麼您仍應該可以通過1.3 SDK來完成此操作。本文介紹了完整的IIS,它允許您在Web角色內配置虛擬目錄和http處理程序。

但我真的建議你看看公衆可讀的blob容器的使用。它爲您提供了相同級別的功能,顯着降低了工作量。您甚至可以將這些技術結合起來,在少量Azure AppFabric緩存中折騰,以便在需要時添加更多靈活性和功能。

1

正如布倫特所言,Azure存儲blob將會有所幫助,特別是如果您啓用Content Delivery Network(全球約有二十多個節點)。

本地目錄高速緩存不能用於本地目錄,因爲每個實例都有單獨的高速緩存目錄。這就是爲什麼許多人一直在使用memcached來滿足多實例緩存需求(David Aiken最近發佈了一個關於在Azure中設置這個的article)。 Brent暗示Azure AppFabric Cache目前處於'預覽'模式(您可以免費試用,但尚未完全準備好生產)。這將很容易讓你緩存你的實例之間的數據(甚至是asp.net會話狀態)。

你如何選擇Blob和本地緩存?使用緩存解決方案(例如memcached或AppFabric緩存),您可以更好地控制誰訪問您的內容,以及捕獲表示下載的總字節數的性能計數器的能力。使用Blobs可以減輕大量工作(網絡,IIS處理和字節轉換,編碼緩存等)的角色實例,甚至加快用戶的瀏覽體驗(瀏覽器通常默認只有兩個併發連接到特定地址; blob技術上會在不同的URL)。此外,您可以使用內容交付網絡來提高頻繁訪問的圖像的性能。