gpt4 book ai didi

asp.net-mvc - 如何在 ASP.NET MVC RC1 中使用 FileResult 返回 304 状态

转载 作者:行者123 更新时间:2023-12-01 23:43:29 25 4
gpt4 key购买 nike

您可能知道,在 ASP.NET MVC 的 RC1 版本中,我们有一个名为 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

基本上,您需要读取请求 header ,比较上次修改日期,如果匹配则返回 304,否则返回图像(状态为 200)并适当设置缓存 header 。

博客中的代码片段:

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

关于asp.net-mvc - 如何在 ASP.NET MVC RC1 中使用 FileResult 返回 304 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/602104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com