2

大規模なレガシー アプリケーションがあり、すべてのイメージを CDN に移動したいと考えています。

現在、すべての画像はアプリケーション ルート自体の下にあるため、パスはすべて次のよう"~/Images/MyImage.jpg." になります。システムの要件により、特定の画像が CDN に存在する場合は、実行時にその画像の完全な URL を特定する必要があります。これにより、バージョン管理、キャッシュなどを厳密に制御できます。イメージごとにコードを変更するのは、非常に長く、退屈で、エラーが発生しやすいプロセスです。

私がやりたいことは、画像のチルダを解決する方法を決定できる ASP.NET のメカニズムにフックできるようにすることです。これにより、既存のすべてのコードをそのままにしておくことができ、画像は実行時に CDN に送信されます。

VirtualPathProvidersについての言及がいくつか見つかりました。これは私が探していたもののように聞こえましたが、テストしたところ、CombineVirtualPaths関数に渡されたパスは で終わるパスだけでした.ASPX, .ASCX, and .MASTER

これのためのクリーンでリスクの低いオプションを見つけるのを手伝ってくれる人はいますか?

基本的に、私が必要とするのは、「~/images/myimage.jpg」が「http://mycdnhost.com/myimage.jpg」としてブラウザーにレンダリングされるアプリ内のどこにでもあります。これにより、ブラウザが画像のリクエストをサーバーに送信することをまったく回避できます。

4

1 に答える 1

3

IISルーティングの使用

別のサイトまたはサーバーから静的コンテンツを提供します。Webアプリケーションは、動的Webコンテンツが1つのサイトまたはサーバーに配置され、すべての静的コンテンツが別のサイトまたはサーバーに配置されるように、複数のサーバーにデプロイされます。URL書き換えモジュールをIISアプリケーション要求ルーティングモジュールと一緒に使用して、静的ファイルに対するすべての要求を別のサーバーに転送し、現在のサーバーからの動的Webページに対するすべての要求を処理できます。このように、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-and-aspnet-routing/をご覧ください。

HttpModuleの使用

  1. 画像リクエストをインターセプトするHttpModuleを作成し、CDNパスにリダイレクトしてみてください。まず、画像ファイルのファイル拡張子をIISのaspnet_isapiにマッピングする必要があります。次に、それらのファイル拡張子のURLリダイレクトを実行するhttpmoduleを追加します。たとえば、モジュールのbeginrequestメソッドでは次のようになります。

    void context_BeginRequest(object sender、EventArgs e){if(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ライフサイクルにオーバーヘッドをかけます。

コントロールアダプタの使用

ハイジャックImageControlRenderメソッドのイメージコントロールのみを処理し、パスをcdn urlに選択的に変更する場合は、ASP.Netコントロールアダプターを試してください。この方法はリスクが少なく、取り外し可能です。

 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>

よろしく。

于 2012-04-25T12:16:45.410 に答える