2016-12-12 4 views
1

データベースからイメージをロードしていて、このイメージを_Layout.cshtmlに表示しています。Asp.Net MVC、データベースからの動的ロードイメージ - イメージの点滅

画像は変更できます(ログイン後)。各社が異なる画像を持つ可能性があるので、ログインした後、データベースにアクセスしてその会社の対応する画像を取得します(Idに基づいて)。私はこのロードされたイメージを保持する必要があり、サーバーに再度行く必要はありません。

すべて正常に動作し、イメージをロードして_Layoutに表示できますが、リクエストごとに_Layoutが再作成されているためイメージが「点滅」します。

私はthis質問(手順1)に従ってデータベースから画像を読み込みました。

私が持っているコードは次のとおりです。

public ActionResult CarregarLogoEmpresa() 
    { 
     if (SecurityManager.Instance.Identity.IsAuthenticated) 
     { 
      var codigoEmpresaLogada = SecurityManager.Instance.Session.IdEmpresa; 

      var logoEmpresa = _empresaAppService.BuscarLogoEmpresa(codigoEmpresaLogada); 

      //return Json(Convert.ToBase64String(logoEmpresa), JsonRequestBehavior.AllowGet); 

      return File(logoEmpresa, "image/jpg"); 
     } 

     return null; 
    } 

とビューで:

<img src='@Url.Action("CarregarLogoEmpresa", "Image")' /> 

は道が点滅毎回を避け、代わりに再作成されるのでロードされたイメージを保つありますか?

+1

は、あなたがしてください持っているコードを投稿してもらえますか? –

+0

@ antoinedelia ready! – Maturano

+0

イメージをDBの外に置くと、ブラウザのキャッシュがおそらくそれを「リロード」しないようにします。または、MVCのpartialviewsを見て、各リクエストをレイアウトにリロードする必要はありません。 – Mackan

答えて

3

この点滅は、データベースからイメージをロードするのにかかる時間が原因と考えられます。このロード時間を最小限に抑えるため、Asp.Net OutputCacheを使用することをお勧めします。

処置:

[OutputCahce(VaryByParam="CodigoEmpresaLogada", Duration=30)] 
public ActionResult CarregarLogoEmpresa(int CodigoEmpresaLogada) 
{ 
    if (SecurityManager.Instance.Identity.IsAuthenticated) 
    { 
     var logoEmpresa = _empresaAppService.BuscarLogoEmpresa(CodigoEmpresaLogada); 

     //return Json(Convert.ToBase64String(logoEmpresa), JsonRequestBehavior.AllowGet); 

     return File(logoEmpresa, "image/jpg"); 
    } 

    return null; 
} 

ビュー:

<img src='@Url.Action("CarregarLogoEmpresa", "Image", new {CodigoEmpresaLogada = SecurityManager.Instance.Session.IdEmpresa})' /> 
1

あなたのイメージは、データベースからロードされているかどうかにかかわらず、すべてのリクエストで点滅します。この効果は、毎回データベースから画像を引き出すのにかかる時間のために増幅される可能性がある。あなたが持っている場合は、別のオプションを検討するようお勧めします。たとえば、AzureやAWSを使用している場合は、イメージをホストするために使用できるファイル/ BLOBストレージがデータベースからロードするよりも高速である可能性があります。私は特に、高価でバックアップが大きくなるため、データベースに画像を保存するのが嫌いです。

「点滅」の問題に戻ります。 GitHubのようないくつかのサイトは、すべてのリクエストで "レイアウト"をリロードせず、変更されたコンテンツだけをリロードします。そのための標準ライブラリはpjaxです(私はGitHubがpjaxを使用すると信じています)。 GitHubはRailsで作られていますが、ソリューションはASP.NET MVCでもうまく動作するはずです。

見てください:いくつか・研究した後

+0

これは分析するのに良いポイントです。間違いなくこれらの例を見ていきます。 今のところ、いくつかのテストをして、[OutputCache]でそれを並べ替えることができます。これを行うより良いアプローチであるかどうかはわかりません。 – Maturano

+0

正しいかどうかを教えてください。 "データベースから読み込まれているかどうかにかかわらず、すべてのリクエストで画像が点滅します。"それは本当ではありません。イメージがサーバーから毎回引き出され、ページのロードに起因するため、「点滅」する理由があります。イメージをリソース、つまり静的コンテンツとして使用すると、クライアントのブラウザ/ PCはイメージをキャッシュすることができます。これは、ページの読み込みにそれ以上の「点滅」がないことを意味します。ここでの提案は、レイアウトの一部である場合、イメージはdbまたはmvcコントローラからロードされるべきではなく、通常のWebコンテンツでなければならないということです。 – Seabizkit

+0

@Seabizkit、イメージはサーバーから動的にロードされます。 同じ人には同じではありません。誰かがログインした場合、その人の画像が表示されます。別の人がログインした場合、別の画像が表示されます。 このイメージが読み込まれると、そのイメージはプロセス中で同じでなければならないということです。 ところで、私はMVCから[OutputCache]を使ってそれを並べ替えることができました! – Maturano

0

を、私は上Asp.Net MVCのActionFilter

[OutputCache(Duration = 300, VaryByParam="none", Location = OutputCacheLocation.Client)] 

を使用して、それを整理することができActionResult。

私はそれがより良いアプローチであるかどうかわかりませんが、少なくともこのケースでは、私のために働いていました。

+0

キーはキャッシュの場所です。他のオプションは、CodigoEmpresaLogadaを渡して、キャッシュを任意の場所に格納することです。 –

関連する問題