2

.NET 3.5と新しいインフラストラクチャを使用するために、.NET2.0Webフォームアプリケーションを移行しています。UpdatePanel内にGridViewがあり、その行に対してアクションを実行するためのアイコンを含むActions列があります。私がIE6で抱えている問題は、画像がキャッシュされていないことです。ロードするアイコンが9個x100行=900個あるため、これは[アクション]列で特に顕著です。Internet Explorerは、これらの画像がすべて読み込まれるまで、900からカウントダウンします。

この問題は、UpdatePanel内にあるGridView内の画像に限定されているようには見えません。これは、ページが更新されるたびにヘッダー画像が再読み込みされるのを確認できるためです。

私は自分の研究をしました:

  • Internet Explorerの「残りのn個のアイテム」の問題を解決するためのアイデアはありますか?-これは別の問題です。
  • IE6様:画像をキャッシュしてください。-これですべての問題が解決すると思いましたが、そうではありませんでした。画像をdiv内の背景画像として設定しようとしましたが、成功しませんでした。また、すべてのアイコンをユーザーコントロール内に配置し、GridViewが読み込まれる前にこれを含めてみました。
  • IIS構成を比較するための古いインフラストラクチャ(この問題は存在しませんでした)があり、それらはまったく同じです。
  • Fiddlerを使用すると、要求されている各画像をイライラするほど見ることができます。キャッシュヘッダーはCache-Control: privateです。Date: Tue, 29 Mar 2011 07:35:53 GMTこのキャッシュヘッダーで(1時間前に)気づきました。それはそれと関係がありますか?
  • このキャッシュの問題は断続的に発生するようです。初めてページをロードしますが、画像はキャッシュされないため、最大1000個の画像が個別にロードされます。ページを更新すると、画像がキャッシュされます。すべての一時ファイル/オフラインコンテンツを削除すると、画像は再び個別に読み込まれます。
  • 最初は、これはアプリケーションを新しいインフラストラクチャにデプロイするときにのみ発生すると思いました(リクエストはフォレスト間で行われます)が、すべてのイメージがローカルの場合はローカルマシンでも発生します。
  • これはIE6でのみ問題になります!!!

他に情報があれば教えてください。

更新1

すでに試みられて成功しなかった回避策:

  • @AfshinGhによって提案されたハンドラーソリューション。UPDATE2回答のコードは実際に機能します。以前に別のバージョンが試行されている必要があります。
  • @BlueSteelによって提案された隠し画像ソリューション。

更新2

他の解決策のいくつかはここで機能したかもしれませんが、私は@AfshinGhによって提供されたコードを使用しました。

4

4 に答える 4

1

このキャッシュパラメータをヘッダーに設定することをお勧めします。

Response.Cache.AppendCacheExtension("post-check=900, pre-check=3600");

詳細については、 http: //www.rdlt.com/cache-control-post-check-pre-check.htmlを読むか、グーグルで検索してください。

それをチェックして、これで問題が解決するかどうか教えてください。

于 2011-04-12T12:32:34.667 に答える
1

フィドラーはキャッシュ制御を表示しますか: 他のブラウザでもプライベートですか? その場合、それらもキャッシュされません。グリッド内の画像を提供するためにカスタム コントロールを使用していますか? その場合、おそらくキャッシュ ヘッダーを正しく処理していません (304 応答などを含む)。

于 2011-04-08T13:35:50.853 に答える
1

このハンドラーを使用します。

Public NotInheritable Class ImageHandler
    Implements IHttpHandler

    Private Const REQUEST_KEY As String = "pic"

    Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property

    Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
        If Not String.IsNullOrEmpty(context.Request.QueryString(REQUEST_KEY)) Then
            Dim fileName As String = context.Request.QueryString(REQUEST_KEY)

            Try

                Dim fileInfo As New IO.FileInfo(context.Server.MapPath(fileName))

                If fileInfo.Exists Then
                    context.Response.Cache.SetCacheability(HttpCacheability.Public)
                    context.Response.Cache.SetExpires(Date.Now.AddYears(1))

                    Dim fileExt As String = fileInfo.Extension.Remove(0, 1).ToUpperInvariant

                    If fileExt = "JPG" Then
                        context.Response.ContentType = "image/jpeg"
                    Else
                        context.Response.ContentType = "image/" & fileExt
                    End If

                    context.Response.TransmitFile(fileInfo.FullName)

                End If

            Catch ex As Exception
            End Try

        End If
    End Sub

End Class

web.config に登録します。

    <httpHandlers>
        <add verb="*" path="image.axd" type="MyApp.ImageHandler, MyApp" validate="false"/>
    </httpHandlers>

次のように使用します。

<img src="image.axd?pic=/App_Themes/Modern/Logo.jpg" />
于 2011-04-07T22:21:58.257 に答える
0

ページの上部 (更新パネルの外側) に 9 つの画像を追加しようとしましたが、非表示に設定しましたか?

<asp:Image ID="Image1" ImageUrl = "images/img1.jpg" runat="server" style = "visibility:hidden" />
<asp:Image ID="Image2" ImageUrl = "images/img2.jpg" runat="server" style = "visibility:hidden" />
<asp:Image ID="Image3" ImageUrl = "images/img3.jpg" runat="server" style = "visibility:hidden" />
...
<asp:Image ID="Image9" ImageUrl = "images/img9.jpg" runat="server" style = "visibility:hidden" /> 
于 2011-04-07T21:02:27.440 に答える