2011-07-31 31 views
8

我需要爲我網站上的所有圖像使用CDN。 因此,我決定使用IIS Url重寫模塊 ,因爲我手動編輯了所有網站視圖 - 這對我來說是不可能的。將圖像放在CDN上,使用IIS7上的MVC3

所以我表現的規則IIS,如:

<rule name="cdn1" stopProcessing="true"> 

    <match url="^Content/Images.*/(.*\.(png|jpeg|jpg|gif))$" /> 

    <action 
     type="Redirect" 
     url="http://c200001.r9.cf1.rackcdn.com/{ToLower:{R:1}}" 
     redirectType="Permanent" /> 

</rule> 

它的工作,但你可以看到有重定向類型使用(301永久)。 我認爲它影響網站性能。 也許有可能編輯請求輸出替換圖片網址?

請指教,我如何使用CDN的圖像,不編輯我的意見,並避免重定向?

任何幫助將不勝感激

回答

7

我同意史蒂夫。您有URL重寫器進行301重定向,但對於頁面需要的每個圖像,瀏覽器仍會首先向服務器發送請求,以發現它已重定向到CDN Url。您現在唯一保存的內容是下載內容。

而不是這樣做,你可以放置一個響應過濾器,將響應發送到客戶端瀏覽器之前修改資產的URL。這樣一來,客戶端瀏覽器從來沒有對您的服務器的靜態資產任何電話:

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    filterContext.RequestContext.HttpContext.Response.Filter = new CdnResponseFilter(filterContext.RequestContext.HttpContext.Response.Filter); 
} 

然後是CdnResponseFilter:

public class CdnResponseFilter : MemoryStream 
{ 
    private Stream Stream { get; set; } 

    public CdnResponseFilter(Stream stream) 
    { 
     Stream = stream; 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     var data = new byte[count]; 
     Buffer.BlockCopy(buffer, offset, data, 0, count); 
     string html = Encoding.Default.GetString(buffer); 

     html = Regex.Replace(html, "src=\"/Content/([^\"]+)\"", FixUrl, RegexOptions.IgnoreCase); 
     html = Regex.Replace(html, "href=\"/Content/([^\"]+)\"", FixUrl, RegexOptions.IgnoreCase);    

     byte[] outData = Encoding.Default.GetBytes(html); 
     Stream.Write(outData, 0, outData.GetLength(0)); 
    } 

    private static string FixUrl(Match match) 
    { 
     //However the Url should be replaced 
    } 
} 

這樣做的結果是,看起來像所有內容資產<img src="\Content\whatever.jpg" />將被轉換爲<img src="cdn-url.com\Content\whatever.jpg" />

+0

這正是我需要的,謝謝你和@Steve! – bogert

+0

我可以問一下,我們應該在ASP MVC應用程序中放置這個響應過濾器? – DevMania

+0

實際的響應過濾器類?只要控制器可以訪問該類,該類就可以駐留在項目中的任何位置。 –

1

鑑於原來的網址將您的內容,而不是來自,例如,從書籤,我想你會遇到麻煩,避免您的網站和重定向的請求;這可能會對使用CDN帶來的好處產生負面影響。

它會更好,如果你可以申請URL重寫到被髮送給瀏覽器,而不是當一個請求進來的HTML。

麻煩的是,我不知道如何(除非你使用ISA服務器,在這種情況下我可以告訴你,但我懷疑你不是)!

您可以創建一個自定義的ActionFilter並覆蓋OnResultExecuted,但您需要使用filter屬性註釋您的控制器。

+0

關於OnResultExecuted:是否可以編輯outgouing html?無法弄清楚,谷歌不想幫助我 – bogert

+0

@邁克的得到了我所捕撈的 - 它是我們想要的ASP.NET響應過濾器,而不是一個MVC ... –