Pertanyaan Bagaimana mengembalikan status 304 dengan FileResult di ASP.NET MVC RC1


Seperti yang Anda ketahui kami punya yang baru ActionResult bernama FileResult dalam versi RC1 ASP.NET MVC.

Dengan menggunakan itu, metode tindakan Anda dapat mengembalikan gambar ke browser secara dinamis. Sesuatu seperti ini:

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

Dalam kode HTML, kita dapat menggunakan sesuatu seperti ini:

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

Karena gambar dikembalikan secara dinamis, kita memerlukan cara untuk menyimpan kembali streaming sehingga kita tidak perlu membaca gambar lagi dari basis data. Saya kira kita bisa melakukannya dengan sesuatu seperti ini, saya tidak yakin:

Response.StatusCode = 304;

Ini memberitahu browser bahwa Anda sudah memiliki gambar di cache Anda. Saya tidak tahu apa yang harus dikembalikan dalam metode tindakan saya setelah menetapkan StatusCode ke 304. Haruskah saya mengembalikan nol atau sesuatu?


13
2018-03-02 12:14


asal


Jawaban:


Blog ini menjawab pertanyaan untuk saya; http://weblogs.asp.net/jeff/archive/2009/07/01/304-your-images-from-a-database.aspx

Pada dasarnya, Anda perlu membaca header permintaan, membandingkan tanggal modifikasi terakhir dan mengembalikan 304 jika mereka cocok, jika tidak mengembalikan gambar (dengan status 200) dan mengatur header cache dengan tepat.

Potongan kode dari blog:

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

26
2018-05-30 08:11



Jangan gunakan 304 dengan FileResult. Dari spesifikasi:

Tanggapan 304 TIDAK HARUS mengandung a   pesan-tubuh, dan dengan demikian selalu   diakhiri oleh baris kosong pertama   setelah bidang header.

Tidak jelas apa yang Anda coba lakukan dari pertanyaan Anda. Server tidak tahu apa yang browser miliki di cache-nya. Browser memutuskan itu. Jika Anda mencoba memberi tahu browser untuk tidak mengambil ulang gambar saat diperlukan lagi jika sudah memiliki salinan, atur tanggapan Header Kontrol Cache.

Jika Anda perlu mengembalikan 304, gunakan EmptyResult sebagai gantinya.


8
2018-03-02 12:54



Dalam versi MVC yang lebih baru, Anda sebaiknya mengembalikan HttpStatusCodeResult. Dengan begitu Anda tidak perlu mengatur Response.StatusCode atau mengacaukan hal lain.

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

0
2018-03-31 18:51