3

.aspx ページを使用して、指定されたパラメーターに従ってファイル システムから画像ファイルを提供しています。

Server.Transfer(imageFilePath);

このコードを実行すると、画像が提供されますが、Last-Modified HTTP ヘッダーは作成されません。同じファイルとは対照的に、同じサーバー上の URL から直接呼び出されます。

そのため、ブラウザーはIf-Modified-Sinceを発行せず、応答をキャッシュしません。

ファイル (その場合は画像) の直接要求で通常行うように、サーバーに HTTP ヘッダーを作成させる方法はありますか、またはヘッダーを手動で作成する必要がありますか?

4

2 に答える 2

1

ファイルへの転送を行うと、サーバーはファイルの場合と同じヘッダーを返します。これは.aspx、基本的に .NET エンジンによって実行されるためです。

基本的に次の 2 つのオプションがあります。

  • 代わりにファイルへのリダイレクトを行い、ブラウザーがそのファイルを要求できるようにします。

  • 必要なヘッダーを設定し、Request.BinaryWrite(または類似の) を使用して、応答でファイル データを送り返します。

于 2012-10-25T13:33:38.393 に答える
1

@Guffa の回答を拡張し、選択したソリューションを共有します。

メソッドを呼び出すとServer.Transfer、.NET エンジンはそれをページのように扱う.aspxため、静的ファイルを提供するときに (キャッシュなどに) 必要な適切な HTTP ヘッダーを追加しません。

3つのオプションがあります

  • を使用Response.Redirectするため、ブラウザは適切なリクエストを行います
  • 必要なヘッダーを設定しRequest.BinaryWrite、コンテンツを提供するために使用する
  • 必要なヘッダーの設定と呼び出しServer.Transfer

私は 3 番目のオプションを選択します。これが私のコードです。

        try
        {
            DateTime fileLastModified = File.GetLastWriteTimeUtc(MapPath(fileVirtualPath));
            fileLastModified = new DateTime(fileLastModified.Year, fileLastModified.Month, fileLastModified.Day, fileLastModified.Hour, fileLastModified.Minute, fileLastModified.Second);
            if (Request.Headers["If-Modified-Since"] != null)
            {
                DateTime modifiedSince = DateTime.Parse(Request.Headers["If-Modified-Since"]);

                if (modifiedSince.ToUniversalTime() >= fileLastModified)
                {
                    Response.StatusCode = 304;
                    Response.StatusDescription = "Not Modified";
                    return;
                }
            }
            Response.AddHeader("Last-Modified", fileLastModified.ToString("R"));
        }
        catch
        {
            Response.StatusCode = 404;
            Response.StatusDescription = "Not found";
            return;
        }
        Server.Transfer(fileVirtualPath);
于 2012-10-25T15:24:05.150 に答える