@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);