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

asp.net-mvc – 如何在ASP.NET MVC RC1中返回304状态与FileResul

发布时间:2020-12-15 23:18:18 所属栏目:asp.Net 来源:网络整理
导读:你可能知道我们在RC1版本的ASP.NET MVC中有一个名为FileResult的新的ActionResult. 使用它,您的操作方法可以动态地将图像返回到浏览器.这样的事情 public ActionResult DisplayPhoto(int id){ Photo photo = GetPhotoFromDatabase(id); return File(photo.Co
你可能知道我们在RC1版本的ASP.NET MVC中有一个名为FileResult的新的ActionResult.

使用它,您的操作方法可以动态地将图像返回到浏览器.这样的事情

public ActionResult DisplayPhoto(int id)
{
   Photo photo = GetPhotoFromDatabase(id);
   return File(photo.Content,photo.ContentType);
}

在HTML代码中,我们可以使用这样的东西:

<img src="http://mysite.com/controller/DisplayPhoto/657">

由于图像是动态返回的,所以我们需要一种方法来缓存返回的流,以便我们不需要再次从数据库中读取图像.我想我们可以这样做,我不知道:

Response.StatusCode = 304;

这告诉浏览器您已经在缓存中拥有图像.将StatusCode设置为304后,我只是不知道在我的操作方法中返回的内容.应该返回null还是什么?

解决方法

这个博客回答了我的问题; http://weblogs.asp.net/jeff/archive/2009/07/01/304-your-images-from-a-database.aspx

基本上,您需要读取请求头,比较最后修改的日期并返回304,否则返回图像(具有200状态),并适当地设置缓存头.

博客的代码段:

public ActionResult Image(int id)
{
    var image = _imageRepository.Get(id);
    if (image == null)
        throw new HttpException(404,"Image not found");
    if (!String.IsNullOrEmpty(Request.Headers["If-Modified-Since"]))
    {
        CultureInfo provider = CultureInfo.InvariantCulture;
        var lastMod = DateTime.ParseExact(Request.Headers["If-Modified-Since"],"r",provider).ToLocalTime();
        if (lastMod == image.TimeStamp.AddMilliseconds(-image.TimeStamp.Millisecond))
        {
            Response.StatusCode = 304;
            Response.StatusDescription = "Not Modified";
            return Content(String.Empty);
        }
    }
    var stream = new MemoryStream(image.GetImage());
    Response.Cache.SetCacheability(HttpCacheability.Public);
    Response.Cache.SetLastModified(image.TimeStamp);
    return File(stream,image.MimeType);
}

(编辑:李大同)

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

    推荐文章
      热点阅读