2011-07-31 14 views
8

私のサイトのすべての画像にCDNを使用する必要があります。 したがって、IISのURL書き換えモジュール を使用することに決めました。私のサイトビューを手動で編集するからです。IIS7でMVC3を使用してCDNに画像を添付

だから、アイブ氏は、例えば、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> 

ITSは働いていますが、型が(301パーマネント)が使用されているリダイレクトがある見ることができるように。 それはサイトのパフォーマンスに影響すると思います。 Request.Outputを編集して画像URLを置き換えることは可能でしょうか?

イメージにCDNを使用するにはどうすればよいですか?自分のビューを編集したりリダイレクトを避けたりするにはどうすればよいですか?

すべてのヘルプは、元のURLがあなたのコンテンツから来ていないことを考えると

答えて

7

私はSteveに同意します。あなたは301のリダイレクトを行う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

これはまさに私が必要なものです。あなたと@スティーブ! – bogert

+0

私はASP MVCアプリケーションでこの応答フィルタをどこに置くべきですか? – DevMania

+0

実際のResponse Filterクラスは?クラスは、コントローラがクラスにアクセスできる限り、プロジェクトのどこにでも配置できます。 –

1

を理解されるであろう、例えば、ブックマークから、私はあなたのサイトへのリクエストやリダイレクトを避け、トラブルを持っていると思います。潜在的に重大なパフォーマンスへの影響は、CDNを使用する利点を無効にする可能性があります。あなたはむしろ要求が入ってきたときよりも、ブラウザに送信されるHTMLにURL書き換えを適用することができればそれが良いだろう

トラブルは、あなたがない限り、私は(方法がわからない、ですISA Serverを使用しています。この場合、私はあなたに伝えることができますが、あなたはそうではないと思われます)!

カスタムActionFilterを作成してOnResultExecutedを上書きできますが、コントローラにフィルタ属性を付ける必要があります。

+0

に変換されます。OnResultExecutedについて:outgouing htmlを編集することは可能ですか?それを把握することはできませんし、Googleは私を助けたいとは思わない – bogert

+0

@マイクは私が釣っていたものを持っています - それはMVCではなくASP.NETレスポンスフィルタです。 –

関連する問題