2012-04-25 61 views
2

我有一個很大的遺留應用程序,我想將所有圖像移動到CDN。覆蓋ASP.NET波浪號(〜)分辨率僅用於圖像

目前,我們所有的圖像駐留在應用程序根目錄本身之下,所以路徑都喜歡"~/Images/MyImage.jpg."由於我們系統的要求,我必須確定完整的URL在運行時給定的圖像,如果它是生活在CDN。這使我們對版本控制,緩存等進行嚴格的控制。逐個進行代碼更改將是一個非常冗長乏味且容易出錯的過程。

我想要做的是能夠掛鉤到ASP.NET中的一些機制,我可以決定如何解決圖像的波浪形。這將允許我們現有的所有代碼保持原樣,並且圖像將在運行時定向到CDN。

我發現VirtualPathProviders一些mentionings,這聽起來像它可能是什麼我一直在尋找,但是當我測試了它,唯一的路徑被傳遞到CombineVirtualPaths功能均與.ASPX, .ASCX, and .MASTER結束路徑。

任何人都可以幫我找到一個乾淨,低風險的選擇嗎?

基本上,我需要的是我的應用程序中的任何地方,我有「〜/ images/myimage.jpg」以呈現給瀏覽器「http://mycdnhost.com/myimage.jpg」。這將避免瀏覽器向我們的服務器發送圖像請求。

+0

什麼是您使用的IIS版本? – 2012-04-25 12:15:45

+0

看看這裏的可能的解決方案:http://stackoverflow.com/questions/4350571/changing-asp-net-application-root – Soliah 2012-05-16 04:01:23

回答

3

使用IIS路由

服務從不同的站點或服務器的靜態內容。 您的Web應用程序部署在多個服務器上,動態Web內容位於一個站點或服務器上,並且所有靜態內容位於不同站點或服務器上。您可以將URL重寫模塊與IIS應用程序請求路由模塊一起使用,將靜態文件的所有請求轉發到其他服務器,同時爲當前服務器提供動態網頁的所有請求。這樣,ASP.NET路由僅用於動態Web內容,不會評估靜態內容的任何URL。

下面的例子表明,你可以使用此方案中的URL重寫規則:

<rewrite> 
    <rules> 
     <rule name="Forward to static file server"> 
      <match url="^.+\.(?:jpg|bmp|gif)$" /> 
      <action type="Rewrite" url="http://static_file_server/{R:0}" /> 
     </rule> 
    </rules> 
</rewrite> 

的更多信息:HTTP://learn.iis.net/page.aspx/496/iis-url -rewriting-和ASPNET路由/

使用的HttpModule

  1. 你應該嘗試建立HTTP模塊是截取圖像請求,並嘗試紅色將它們直接轉到您的CDN路徑。首先,您需要將映像文件的文件擴展名映射到IIS中的aspnet_isapi。 然後,添加一個爲這些文件擴展名執行url重定向的httpmodule。 例如,在模塊的方法的BeginRequest:

    空隙context_BeginRequest(對象發件人,EventArgs的) { 如果(request.url.endwith .JPG/.PNG ...) 重定向到路徑相對於所述根夾。 }

  2. 使用httpmodule的另一個選擇是攔截呈現的HTML並使用正則表達式替換圖像URL以指向CDN。在這裏你可以看到它是如何工作http://shoaibsheikh.blogspot.com/2012/05/change-image-url-in-aspnet-using.html

這種方法將會把頭頂在asp.net生命週期,因爲我們將收到的已發送到客戶端攔截整個頁面。

使用控制適配器

你應該嘗試ASP.Net控件適配器如果要辦理劫持圖像控制只圖像控件Render方法,並選擇性地改變CDN的URL路徑。這種方法風險較小,可拆卸。

public class CDNImageControlAdapter : ControlAdapter 
    { 
     protected override void Render(HtmlTextWriter writer) 
     { 
      Image img = this.Control as Image; 
      if (img == null) 
      { 
       base.Render(writer); 
       return; 
      } 

      if (img.ImageUrl.Length > 0) 
      { 
       // Let the HyperLink render its begin tag 
       img.RenderBeginTag(writer); 

       Image image = new Image(); 

       if (img.ImageUrl.IndexOf("~") == 0) 
       { 
        img.ImageUrl = (img.ImageUrl.Replace("~", "http://mycdn.com/images/")); 

       } 

       img.RenderControl(writer); 
      } 
      else 
      { 
       // HyperLink.RenderContents handles a couple of other 
       // cases if its ImageUrl property hasn't been set. We 
       // delegate to that behavior here. 
       base.Render(writer); 
      } 
     } 
    } 

,並添加All.broswer文件這App_Browsers文件夾應用

<!-- 
    You can find existing browser definitions at 
    <windir>\Microsoft.NET\Framework\<ver>\CONFIG\Browsers 
--> 
<browsers> 
    <browser id="Default"> 
    <controlAdapters> 
     <adapter controlType="System.Web.UI.WebControls.Image" adapterType="CDNImageControlAdapter, MyWebApplication" /> 
    </controlAdapters> 
    </browser> 
</browsers> 

祺。

+0

代碼沒有測試,你應該整合和調試。 – 2012-04-25 12:17:15

+0

這個解決方案對我來說並不理想,因爲這隻會解決Image控件問題。我想在任何地方使用代字號指定圖像路徑。這可以是任何數量的WebControls,HtmlControls或第三方控件上的任意數量的屬性。我需要一個通用修復程序。 – 2012-05-03 17:18:26

+0

好吧,我想你只關心圖像控制。在你的情況下,你應該嘗試使用httpmodule,但爲此,你將不得不映射圖像擴展以通過託管isapi模塊,可能會在服務器上的asp.net進程開銷,但這是一個選項。 – 2012-05-04 05:03:34