【发布时间】:2021-12-11 23:42:11
【问题描述】:
嘿,我一直在努力让我的 20 多个缩略图进入缓存状态,因此每次加载/重新加载页面时它并不总是让服务器获取图像。
我已经在我的响应调用中实现了“eTag”,如下所示:
var uriFetcher = new UriFetcher(fileUri);
var tempPath = uriFetcher.FetchFile();
var mime = MimeType(tempPath);
//displays like: xxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.png
//This is the image file name. These names do not change.
string theETag = tempPath.Split('\\').Last();
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetLastModified(DateTime.Now);
context.Response.Cache.SetValidUntilExpires(true);
context.Response.Cache.SetExpires(DateTime.Now.AddYears(1));
context.Response.Cache.SetMaxAge(new TimeSpan(1, 0, 0));
context.Response.CacheControl = "private";
context.Response.ContentType = mime;
//Add current image file name to the eTag
context.Response.AddHeader("ETag", "\"" + theETag + "\"");
var disposition = new ContentDisposition
{
FileName = Path.GetFileName(tempPath),
Inline = mime.Contains("image")
};
context.Response.AddHeader("content-disposition", disposition.ToString());
try {
context.Response.TransmitFile(tempPath);
} catch {
context.Response.TransmitFile(errorUri);
}
现在,在上面的 .cs 部分之后,它转到一个使用 jQuery 框架的 JavaScript 函数,以便将其放置到页面上供用户查看:
var imgThumbnail = img('thumbnail', '/' + thumbnailId + '/Thumbnail', preload)
.tipsy({
html: true,
assetMode: false,
fallback: assetData.Tooltip.html(),
gravity: ($container.closest('#Side').length == 0) ? $.fn.tipsy.auto : 'e',
topOffset: topOffset
});
if (assetData.ProcessingRollupStatus != null) {
if (assetData.ProcessingRollupStatus === 'Processing') {
imgThumbnail.addClass('processing-status-processing');
} else if (assetData.ProcessingRollupStatus === 'Waiting') {
imgThumbnail.addClass('processing-status-waiting');
}
}
$container
.addClass('asset-item')
.data('AssetData', assetData)
.attr('id', assetData.Id)
.append(imgThumbnail);
Firefox 的输出是这样的:
所以我遇到问题的部分是当我在页面加载/刷新时检查 eTag。我不确定我应该将该代码放在什么(或放在哪里)以便它不加载图像(如果它们已经在缓存中)?
我在想这样的事情:
var requestedETag = context.Request.Headers["If-None-Match"];
if (requestedETag == last)
{
return new HttpStatusCodeResult(HttpStatusCode.NotModified);
//context.Result = new StatusCodeResult(304);
} else {
...........
那么,有人愿意告诉我如何进行这项检查吗?
【问题讨论】:
标签: c# jquery asp.net caching etag