HTTP-заголовок Cache-Control работает правильно

У меня проблема с контролем кеша. У меня есть один веб-сайт IIS с несколькими заголовками узлов. Когда вы просматриваете сайт номер 1, для этого сайта будет установлен кеш, когда вы снова откроете браузер и перейдете на второй сайт, вы увидите контент с первого сайта. Как я могу определить содержимое кеша на основе посещений сайта пользователями? Все работает нормально, когда у вас есть 1 сайт и заголовок хоста, относящийся к ОДНОМУ сайту.

//Set Cacheability
if (!Context.User.Identity.IsAuthenticated && _activeNode.CacheDuration > 0)
{
    var eTag = GetETag(_activeNode);
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
    if (IsClientCached(_activeNode.UpdateTimestamp))
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.StatusCode = (int)HttpStatusCode.NotModified;
        HttpContext.Current.Response.SuppressContent = true;
        HttpContext.Current.Response.End();
        return;
    }

    var incomingEtag = HttpContext.Current.Request.Headers["If-None-Match"];
    if (String.Compare(incomingEtag, eTag) == 0)
    {
        HttpContext.Current.Response.StatusCode = (int)HttpStatusCode.NotModified;
        HttpContext.Current.Response.SuppressContent = true;
        HttpContext.Current.Response.End();
        return;
    }

    HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.ToUniversalTime().AddMinutes(_activeNode.CacheDuration));
    HttpContext.Current.Response.Cache.SetMaxAge(new TimeSpan(0, _activeNode.CacheDuration, 0));
    HttpContext.Current.Response.Cache.SetLastModified(_activeNode.UpdateTimestamp);
    HttpContext.Current.Response.Cache.SetETag(eTag);
}

/// <summary>
/// Gets the ETag.
/// </summary>
/// <param name="node">The node.</param>
/// <returns></returns>
private static string GetETag(Node node)
{
    var etag = String.Format("{0}_{1}", node.Site.Id, node.Id);
    return "\"" + Encryption.StringToMD5Hash(etag).Replace("-", null) + "\"";
}

/// <summary>
/// Determines whether [is client cached] [the specified content modified].
/// </summary>
/// <param name="contentModified">The content modified.</param>
/// <returns>
///     <c>true</c> if [is client cached] [the specified content modified]; otherwise, <c>false</c>.
/// </returns>
private bool IsClientCached(DateTime contentModified)
{
    var header = Request.Headers["If-Modified-Since"];
    if (header != null)
    {
        DateTime isModifiedSince;
        if (DateTime.TryParse(header, out isModifiedSince))
        {
            return isModifiedSince > contentModified;
        }
    }

    return false;
}

person agassan    schedule 22.03.2011    source источник


Ответы (1)


Похоже, вам следует добавить значение заголовка хоста в свой алгоритм IsClientCached

person matt-dot-net    schedule 22.03.2011
comment
Вы просите добавить Request.Header.Add (Host, www.host.com); затем использовать это значение для проверки? Если вы посмотрите на метод ETag, вы обнаружите, что мы генерируем базу etag на основе значений базы данных, поэтому etag является уникальным. Вот почему я так сбита с толку. Когда etag уникален, почему он его кеширует? Я провел небольшое исследование и нашел одну статью, в которой упоминается, что теги относятся к сайту, что не имеет никакого значения. - person agassan; 22.03.2011
comment
Браузер уже должен отправлять заголовок хоста. Я говорю, что вам нужно сделать значение заголовка хоста частью вашего ключа к кешу. - person matt-dot-net; 23.03.2011