2011-02-02 16 views
1

私は現在専用サーバーのサイトを運営していますが、将来はMicrosoft Azureクラウドプラットフォームを使用してスケールアップしたいのですが、私のコードのcertin部分が紺色で動作するか確信できません。Azure asp.netで画像を生成

サイトは、アイテムのギャラリーと各アイテムの画像で構成されています。 イメージはsqlserverデータベースに格納されます。

イメージをディスクにキャッシュし、リクエストをイメージにリダイレクトするHTTPハンドラを作成しました(投稿の最後に表示されています)。

イメージは、ASP.NETアプリケーション内の "imagecache"という仮想ディレクトリに保存されます。 (〜/ imagecache /)。

WebアプリケーションはAzureプラットフォームの多くの仮想マシンインスタンスで実行されるため、イメージはインスタンス間で共有する必要がありますか?

私の質問は本当に..私がすでに持っているものを達成するための最良の方法は、互換性のあるウィット・アジールですか?

おかげ

画像GENコード..

public class getimage : IHttpHandler { 


    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

    public void ProcessRequest (HttpContext context) { 

     try 
     { 

      string uniqueid = ""; 

      if(context.Request.QueryString["id"]) uniqueid = context.Request.QueryString["id"].ToString(); 

      string dir = "~/imagecache/"; 
      string image_target_path = dir + "image-file-" + uniqueid + ".png"; 

      byte[] data = null; 
      context.Response.ContentType = "image/png"; 

      if (!System.IO.File.Exists(context.Server.MapPath(image_target_path))) 
      { 
       if (context.Request.QueryString["id"] != null) 
       { 
        // get image data from the database 
        data = ImageHelper.getDatabaseImageDataByID(Convert.ToInt32(uniqueid)); 

        using (System.Drawing.Image img = System.Drawing.Image.FromStream(new System.IO.MemoryStream(data))) 
        { 
         // save image to disk in the virtual dir 
         img.Save(context.Server.MapPath(image_target_path)); 
        } 
       } 
       else 
       { 
        // set a sample image if no id is set 
        image_target_path = "~/images/noimage.png"; 
       } 
      } 

      // redirect request to image file 
      context.Response.Redirect(image_target_path, false); 

     } 
     catch (Exception ex) 
     { 
      log.Error(ex.Message, ex); 
     } 
    } 

    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 

} 

答えて

5

簡単な答えはここAzureストレージのBLOBへのSQLからイメージストアを移動するだろう。それらのブロブ用のコンテナは、あなたがキャッシュ層との仲介者として行動する必要なく、URLを介して公開されアクセスされることができます。

しかし、アプリケーションがhttpハンドラを介してその仲介者として動作するようにするには、1.3 SDKを使用してアプリケーションを実行する必要があります。このバージョンでは、Webロール内に仮想ディレクトリとHTTPハンドラを構成できる完全なIISが導入されました。

しかし、私はあなたが一般に読めるBlobコンテナの使用を見てみることを本当にお勧めします。これは、レベルの大幅な削減のために同じレベルの機能を提供します。技術を組み合わせて、必要に応じて柔軟性と機能を追加するためにAzure AppFabricキャッシュのピンチを投げることさえできます。

1

ブレント氏によると、Azure Storage BLOBが役立つでしょう。特に世界中で約2ダースのノードを持つコンテンツ配信ネットワークを有効にすると便利です。

ローカルディレクトリのキャッシュは、各インスタンスごとに別々のキャッシュディレクトリがあるため、ローカルディレクトリだけでは機能しません。これは、多くの人がマルチインスタンスのキャッシュニーズにmemcachedを使用してきた理由です(David Aiken氏は最近Azureでこれを設定することについてarticleと投稿しました)。

ブレントはAzure AppFabric Cacheで、現在はプレビューモードになっています(無料で試すことができますが、まだ生産には向いていません)。これにより、簡単にインスタンス間でデータをキャッシュすることができます(asp.netセッション状態でも)。

ブロブとローカルキャッシュのどちらを選択しますか? memcachedやAppFabricのキャッシュなどのキャッシュソリューションを使用すると、コンテンツにアクセスするユーザーや、ダウンロードされた合計バイト数を表すパフォーマンスカウンタを取得する機能をより詳細に制御できます。ブロブを使用すると、多くの作業(ネットワーキング、IIS処理、バイト変換、キャッシュのコーディングなど)の役割のインスタンスが緩和され、ユーザーのブラウザーエクスペリエンスが向上します(ブラウザーは通常、ブロブは技術的には別のURLにあります)。さらに、頻繁にアクセスするイメージのパフォーマンスを向上させるために、コンテンツ配信ネットワークを使用することもできます。

関連する問題