データベースから画像を取得するために .ashx ハンドラーを使用しました。この方法で大量の画像 (>1000) を取得したい:
<img src='GetImage.ashx?id= <%# Eval("id") %>'/>
(なぜ私がこれを行うのかは、前の質問を読んでいただければ理解できます:.ascx の ItemTemplate にデータベース イメージをバインドします)。たくさんの時間ですよね?可能な解決策は何ですか?
データベースから画像を取得するために .ashx ハンドラーを使用しました。この方法で大量の画像 (>1000) を取得したい:
<img src='GetImage.ashx?id= <%# Eval("id") %>'/>
(なぜ私がこれを行うのかは、前の質問を読んでいただければ理解できます:.ascx の ItemTemplate にデータベース イメージをバインドします)。たくさんの時間ですよね?可能な解決策は何ですか?
キャッシングは、頻繁に要求される静的なコンテンツには常に良い考えです。
また、画像が比較的小さい場合は、データ URI のhttp://css-tricks.com/data-uris/を使用できます。
ID INT、名前 VARCHAR(64)、MimeType VARCHAR(64)、およびデータ VARBINARY(MAX) を持つ Images テーブルがあるとします。
SELECT Name, 'data:' + MimeType + ';base64,' + cast(N'' as xml).value('xs:base64Binary(xs:hexBinary(sql:column("Data")))', 'VARCHAR(MAX)') AS DataURI
<img src='<%# Eval("DataURI") %>' alt='<%# Eval("Name") %> />
このようにして、すべてを返す 1 つのデータベース クエリを作成できます。
まず第一に、ブラウザはすべての画像を一度に要求するのではなく、一度にいくつかの画像を要求しました。
次に、ハンドラーはセッションを使用しないため、互いにロックされないため、イメージ呼び出しに対して並列プロセスを実行できます。
ブラウザのキャッシュを追加することをお勧めします。そのため、画像をロードするときに再度要求しないようにします。
例:
context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(120));
context.Response.Cache.SetMaxAge(new TimeSpan(0, 120, 0));
しかし、よりアグレッシブなキャッシュを追加できます。
同様の質問の 1 つ: aspx ページを呼び出して、ランダムに遅い画像を返す