13

ご存知かもしれませんが、 ASP.NETMVCの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などを返す必要がありますか?

4

3 に答える 3

27

このブログは私の質問に答えました。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);
}
于 2010-05-30T08:11:01.987 に答える
0

MVC の新しいバージョンでは、HttpStatusCodeResult を返す方がよいでしょう。そうすれば、Response.StatusCode を設定したり、他のものをいじったりする必要はありません。

public ActionResult DisplayPhoto(int id)
{
    //Your code to check your cache and get the image goes here 
    //...
    if (isChanged)
    {
         return File(photo.Content, photo.ContentType);
    }
    return new HttpStatusCodeResult(HttpStatusCode.NotModified);
}
于 2014-03-31T18:51:15.463 に答える