ASP.NET MVC:コントローラからCDNイメージを返す

私はMVCコントローラからイメージを返す方法を知っていますが、MVCコントローラからCDNのイメージを返すと、イメージにCDNを使用する目的を無効にするかどうか疑問に思っていました。次のコードを使用すると、WebアプリケーションをホストしているWebサーバーがCDNからダウンロードされ、Webサーバーからユーザーがダウンロードできるようになりますか?イメージがCDNからWebサーバーに1回、Webサーバーからユーザーに2回ダウンロードされていますか?もしそうなら、Webサーバー上で直接画像をホストするよりも悪いですか?または、CDNからエンドユーザーに直接ダウンロードした画像は1回だけですか?

MVCコントローラからイメージを返すと同時に、CDNのメリットを得る方法を教えてください。

    public ActionResult Thumb(int id)
    {
        //process 
        var file = Server.MapPath(" path to image in the CDN ");
        //do your stuff
        return File(file, "image/jpg", Path.GetFileName(file));
    }
4

6 答え

あなたのコントローラのアクションでは、リモートサーバからイメージをフェッチするためにHTTPリクエストを実行する必要があります:

public ActionResult Thumb(int id)
{
    using (var client = new WebClient())
    {
        byte[] image = client.DownloadData("http://cdn.foo.com/myimage.jpg");
        return File(image, "image/jpg");
    }
}

その後:


明らかに、画像は2回ダウンロードされます。 CDNからコントローラに1回、クライアントから1回。これはこのコントローラーアクションの目的を完全に打ち消し、CDNから直接画像を参照することができます:


これは明らかに、クライアントがCDNにアクセスできることを前提としています。

もちろん、コントローラのアクションがCDNからイメージを取り出してCDNからイメージを取り出してサイズを変更するなど、クライアントにストリーミングするだけでなく、最初の方法を間違いなく実行する必要があります。

8
追加された

Server.MapPathは、イメージの物理パスをマップするために使用されます。物理パスにローカルに存在しないため、CDNイメージでは何も実行しません。そして、いいえ、あなたはファイルを返すことを望んでいません。

あなたのHTMLは タグでCDNイメージを参照するだけです。すなわち、


1
追加された

私はURL書き換えモジュール2.0 outboundRulesを使用します。 レスポンスhtml Img(images)、Link(css)、Script(js)タグurl。

URL Rewrite Module 2.0 Configuration Reference : URL Rewrite Module 2 : URL Rewrite Module : The Official Microsoft IIS Site

現在の対応

...


...

web.config urlrewrite設定を設定します。


    
        
            
            
        
        
            
                
            
        
    

リライトレスポンス

...


...

この助けを願っています。

1
追加された

CDN URLを解決するために、いくつかのIDに基づいてルックアップを行うのと同様に、まずリソースを把握するために何らかのコンピューティングを行う必要があると仮定します。あなたは絶対にWebクライアントを使用せず、イメージをバイト配列にダウンロードする必要があります。ファイルをダウンロードする必要がある場合、基本的には揮発性のリソースとなり、回路ブレーカを使用してキャッシュを使用せずに対処する方法を決定する必要があります。また、バッファを使用してそれを使用しないようにする必要があります多くの記憶。

この場合、URLを解決し、ユースケースに応じてリダイレクト301/302を使用するのが最適です。

public ActionResult Thumb(int id)
{
    //resolve url
    var file = " path to image in the CDN ";
    //redirect permanent
    return RedirectPermanent(file);
    //OR redirect 
    return Redirect(file);
}
1
追加された

Don't return the the actual image from the controller. That is worse because then you download it twice (CDN -> server -> client). You don't need a Thumb action at all.

コントローラ内のCDN上のファイルへのリンクを生成する必要がある場合は、ビューのモデルにCDNリンク用のプロパティを追加してコントローラに設定するだけです。

コントローラにリンクを作成します。

public ActionController SomeAction(int id){
   var model = new SomeActionViewModel();

   model.CDNLink =//do some stuff to generate CDN Link and set them on the model;
   return View(model);
}

最後に、あなたの視点でそれを設定します


1
追加された

CDNの設定はさまざまですが、最も一般的な設定は、CDNサーバーがサーバー用の大規模な分散プロキシー(「オリジンサーバー」)として機能することです。

CDNは、あなたのコンテンツをどのように配信するか気にしません。コンテンツをURL、コンテンツタイプ、またはその他の要因でプロキシすることができます。

したがって、コントローラから配信されたコンテンツが変更されないと仮定したあなたの状況は、次のように設定できます。

  1. CDNサーバーへのリクエスト
  2. オリジンサーバ上のコントローラメソッドに対するCDNサーバ要求
  3. コントローラメソッドがコンテンツを生成する
  4. 後続のリクエストのためのCDNキャッシュコンテンツ
  5. CDNがコンテンツを返す
  6. 同じ内容のURLによる後続のリクエストがCDNから返されます

静的コンテンツを返すときに最も重要な要素は、使用するURL構造です。

CDNは、キャッシュと期限切れの点でレスポンスヘッダーを気にかけますが、URLで独自のコンテンツを提供するためにURLを正しくフィニッシュすることができれば避けるのが最善です(たとえば、バージョニングの問題を解決するため)。

コンテンツを保護しようとする場合は、CDNでも可能ですが、一般的にCDN固有の技術が必要です。

1
追加された