Ale*_*voi 11 asp.net asp.net-mvc caching outputcache asp.net-mvc-3
我已经阅读了很多关于缓存的帖子,但它们中没有一个确实符合我的需求.在我的mvc 3应用程序中,我有一个动作方法GetImage(),它返回一个图像类型的文件.然后我在视图中使用此方法来显示图像:
<img width="75" height="75" src="@Url.Action("GetImage", "Store", new {productId = item.ProductId})"/>
Run Code Online (Sandbox Code Playgroud)
我想在服务器上缓存图像.所以,我已经尝试过:
1)使用OutputCacheAttribute:
[HttpGet, OutputCache(Duration = 10, VaryByParam = "productId", Location = OutputCacheLocation.Server, NoStore = true)]
public FileContentResult GetImage(int productId)
{
var p = _productRepository.GetProduct(productId);
if (p != null)
{
if (System.IO.File.Exists(GetFullProductImagePath(productId)))
{
var image = Image.FromFile(GetFullProductImagePath(productId));
return File(GetFileContents(image), "image/jpeg");
}
}
var defaultPath = AppDomain.CurrentDomain.BaseDirectory +
ConfigurationManager.AppSettings["default-images-directory"];
var defaultImage = Image.FromFile(Path.Combine(defaultPath, "DefaultProductImage.jpg"));
return File(GetFileContents(defaultImage), "image/jpeg");
}
Run Code Online (Sandbox Code Playgroud)
图像没有缓存(我得到状态:200 OK)
2)在GetImage()方法中使用以下Response.Cache方法:
public FileContentResult GetImage(int productId)
{
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetMaxAge(new TimeSpan(0, 0, 0, 10));
Response.Cache.SetExpires(DateTime.Now.Add(new TimeSpan(0, 0, 0, 10)));
Response.Cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
// other code is the same
}
Run Code Online (Sandbox Code Playgroud)
图像未缓存
3)我得到:304 Not Modified,但GetImage()方法什么都不返回(空图像)
public FileContentResult GetImage(int productId)
{
Response.StatusCode = 304;
Response.StatusDescription = "Not Modified";
Response.AddHeader("Content-Length", "0");
// other code is the same
}
Run Code Online (Sandbox Code Playgroud)
问题:如何在服务器上缓存此操作方法的输出?
Dar*_*rov 14
试试这样:
[HttpGet]
[OutputCache(
Duration = 10,
VaryByParam = "productId",
Location = OutputCacheLocation.ServerAndClient)]
public ActionResult GetImage(string productId)
{
...
}
Run Code Online (Sandbox Code Playgroud)
需要注意的事项:使用OutputCacheLocation.ServerAndClient和摆脱NoStore = true.
| 归档时间: |
|
| 查看次数: |
4928 次 |
| 最近记录: |