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の使用
画像リクエストをインターセプトするHttpModuleを作成し、CDNパスにリダイレクトしてみてください。まず、画像ファイルのファイル拡張子をIISのaspnet_isapiにマッピングする必要があります。次に、それらのファイル拡張子のURLリダイレクトを実行するhttpmoduleを追加します。たとえば、モジュールのbeginrequestメソッドでは次のようになります。
void context_BeginRequest(object sender、EventArgs e){if(request.url.endwith .jpg / .png ...)ルートフォルダーを基準にしたパスにリダイレクトします。}
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>
よろしく。