OutputCache.VaryByHeader не генерирует заголовок Vary в ответе - PullRequest
5 голосов
/ 28 сентября 2011

У меня есть этот метод действия:

    [OutputCache(Duration = 2, 
                 Location = OutputCacheLocation.Any, 
                 VaryByHeader = "Accept-Charset")]
    public ActionResult Index()
    {
        return View();
    }

И сгенерированный ответ:

Cache-Control:public, max-age=2
Content-Length:5164
Content-Type:text/html; charset=utf-8
Date:Wed, 28 Sep 2011 16:30:33 GMT
Expires:Wed, 28 Sep 2011 16:30:35 GMT
Last-Modified:Wed, 28 Sep 2011 16:30:33 GMT
Server:Microsoft-IIS/7.5
Vary:*
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:3.0
X-Powered-By:ASP.NET

Почему заголовок Vary показывает звездочку вместо Accept-Charset?

OutputCacheAttribute действительно влияет на ответ, фактически заголовки Expires и Cache-Control:max-age=n зависят от аргумента Duration, а Cache-Control:public / private / no-cache зависит отLocation аргумент.

Я создал оболочку для OutputCacheAttribute, чтобы увидеть, что происходит:

public class CustomOutputCacheAttribute:OutputCacheAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        base.OnResultExecuted(filterContext);

        Dictionary<String, String> headers = new Dictionary<string, string>();
        foreach (var header in filterContext.HttpContext.Response.Headers.AllKeys)
            headers.Add(header, filterContext.HttpContext.Response.Headers[header]);

        Debugger.Break();
    }
} 

Заголовки не отображаются в разрыве, так что, вероятно, OutputCacheAttribute делает это настроить HttpContext.Current.Response.Cache.

Я могу видеть, как filterContext.HttpContext.Response.Cache.VaryByHeaders.UserCharSet это true , и, например, filterContext.HttpContext.Response.Cache.VaryByHeaders.AcceptTypes это false , но VaryВ заголовке всегда указывается *.

Мне интересно, если единственными возможными значениями являются четыре, перечисленные в качестве свойств filterContext.HttpContext.Response.Cache.VaryByHeaders, это может быть?

Cheers.

Ответы [ 2 ]

7 голосов
/ 30 сентября 2011

Используется решение Response.Cache.SetOmitVaryStar(true)

    [OutputCache(Duration = 2,
         Location = OutputCacheLocation.Any,
         VaryByHeader = "Accept-Charset")]
    public ActionResult Index()
    {
        Response.Cache.SetOmitVaryStar(true);
        return View("ShowHeaders");
    }

Я все еще пытаюсь выяснить, что не так с Vary: * в этой теме: Что означает заголовок HTTP Vary: *

0 голосов
/ 29 сентября 2011

<% @ OutputCache Duration = "2000" VaryByParam = "*" VaryByHeader = "Accept-Language"%>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...