8

サイトのすべての画像にCDNを使用する必要があります。そこで、すべてのサイトビューを手動で編集するため、IISUrl-rewritingモジュールを使用することにしました。これは私には不可能です。

そこで、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パーマネント)。そして、それはサイトのパフォーマンスに影響を与えると思います。たぶん、Request.Outputを編集して画像のURLを置き換えることは可能ですか?

アドバイスをお願いします。画像にCDNを使用し、ビューを編集せず、リダイレクトを回避するにはどうすればよいですか?

どんな助けでもありがたいです

4

2 に答える 2

7

私はスティーブに同意します。URLリライタが301リダイレクトを実行していますが、ページが必要とするすべての画像について、ブラウザは最初にサーバーにリクエストを送信して、301がCDNUrlにリダイレクトされていることを検出します。この時点で保存しているのは、コンテンツのダウンロードだけです。

その代わりに、応答がクライアントブラウザーに送信される前に、アセットの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" />

于 2011-07-31T22:37:04.170 に答える
1

元のURLがブックマークなどではなくコンテンツからのものであることを考えると、サイトへのリクエストやリダイレクトを回避するのに問題があると思います。CDNを使用するメリットを打ち消す可能性のある重大なパフォーマンスへの影響。

リクエストが届いたときよりも、ブラウザに送信されるHTMLにURL書き換えを適用できるとよいでしょう。

問題は、方法がわからないことです(ISAサーバーを使用している場合を除きます。その場合、私はあなたに言うことができますが、そうではないと思います)!

カスタムActionFilterを作成し、OnResultExecutedをオーバーライドすることもできますが、コントローラーにfilter属性の注釈を付ける必要があります。

于 2011-07-31T22:12:19.453 に答える