加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

如何缓存输出的action方法,返回图像到asp.net mvc中的视图?

发布时间:2020-12-15 19:40:26 所属栏目:asp.Net 来源:网络整理
导读:我已经阅读了很多关于缓存的帖子,但是没有一个真正符合我的需求.在我的mvc 3应用程序中,我有一个Get Image()方法返回一个图像类型的文件.然后我在这个视图中使用这种方法来显示图像: img width="75" height="75" src="@Url.Action("GetImage","Store",new {
我已经阅读了很多关于缓存的帖子,但是没有一个真正符合我的需求.在我的mvc 3应用程序中,我有一个Get Image()方法返回一个图像类型的文件.然后我在这个视图中使用这种方法来显示图像:
<img width="75" height="75" src="@Url.Action("GetImage","Store",new {productId = item.ProductId})"/>

我想在服务器上缓存图像.所以,我已经尝试过:

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");
    }

图像没有缓存(我得到状态:200 OK)

2)在GetImage()方法中使用以下Response.Cache方法:

public FileContentResult GetImage(int productId)
    {
        Response.Cache.SetCacheability(HttpCacheability.Public);
        Response.Cache.SetMaxAge(new TimeSpan(0,10));
        Response.Cache.SetExpires(DateTime.Now.Add(new TimeSpan(0,10)));
        Response.Cache.AppendCacheExtension("must-revalidate,proxy-revalidate");        
        // other code is the same
    }

图像不缓存

3)这里我得到:304未修改,但GetImage()方法返回任何东西(空图像)

public FileContentResult GetImage(int productId)
    {
        Response.StatusCode = 304;
        Response.StatusDescription = "Not Modified";
        Response.AddHeader("Content-Length","0");     
        // other code is the same
    }

问题:如何在服务器上缓存此操作方法的输出?

解决方法

尝试这样:
[HttpGet]
[OutputCache(
    Duration = 10,Location = OutputCacheLocation.ServerAndClient)]
public ActionResult GetImage(string productId)
{
    ...
}

注意事项:使用OutputCacheLocation.ServerAndClient并取消NoStore = true.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读