Как возврат 304 состояния с FileResult в ASP.NET MVC RC1

Когда в мобильном телефоне вы можете использовать сеанс Javascript вместо

sessionStorage.setItem('session_variable',session_value);
13
задан Meysam 2 March 2009 в 12:14
поделиться

2 ответа

Не используйте 304 с FileResult. От спецификации:

304 ответа не ДОЛЖНЫ содержать тело сообщения и таким образом всегда завершаются первой пустой строкой после полей заголовка.

Не ясно, что Вы пытаетесь сделать от своего вопроса. Сервер не знает то, что браузер имеет в его кэше. Браузер решает это. При попытке сказать браузеру не повторно выбирать изображение при необходимости снова, если это уже имеет копию, установите заголовок Управления Кэша ответом.

Если необходимо возвратиться 304, используйте EmptyResult вместо этого.

8
ответ дан 1 December 2019 в 19:41
поделиться

Этот блог ответил на мой вопрос; 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);
}
26
ответ дан 1 December 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: