Невозможно добавить заголовок 'Vary' к ответу

Я пытаюсь добавить Vary: Accept-Encoding заголовок в ответ на файлы, которые я сжимаю, как советовали ранее.

Однако, по какой-то причине это невозможно - ни с тестового сервера Visual Studio, ни с сервера IIS.

У меня есть следующий код:

if (url.Contains(".js") || url.Contains(".aspx") || url.Contains(".css"))
{
    app.Response.AppendHeader("Vary", "Accept-Encoding");
    app.Response.AppendHeader("Varye", "Accept-Encoding"); // for testing
    app.Response.AppendHeader("Varye", "Accept-Things");   // for testing
    app.Response.AppendHeader("Vary", "Accept-Stuff");     // for testing
    app.Response.AppendHeader("Var", "Accept-Items");      // for testing

    encodings = encodings.ToLower();

    if (encodings.Contains("gzip") || encodings == "*")
    {
        app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress);
        app.Response.AppendHeader("Content-Encoding", "gzip");

    }
}

в результате получается следующий заголовок ответа:

Status=OK - 200
Server=ASP.NET Development Server/10.0.0.0
Date=Fri, 21 Oct 2011 12:24:11 GMT
X-AspNet-Version=4.0.30319
Varye=Accept-Encoding, Accept-Things
Var=Accept-Items
Content-Encoding=gzip
Cache-Control=public
Etag="1CC8F2E9D772300"
Content-Type=text/css
Content-Length=16200
Connection=Close

Как видите, заголовок Vary отсутствует. Бессмысленные заголовки с похожим синтаксисом присутствуют, поэтому должно быть что-то, где-то, убирает заголовок Vary перед отправкой.

Не знаю, имеет ли это значение, но вот где я определяю свой модуль сжатия в web.config:


    

(Где Utility.HttpCompressionModule - это класс, к которому принадлежит выдержка из кода, которую я привел выше.)

Почему я не могу добавить Vary заголовок?

EDIT: Решение Эрика Си оставило мне такой код:

if (url.Contains(".js") || url.Contains(".aspx") || url.Contains(".css"))
{
    app.Response.Cache.SetVaryByCustom("Accept-Encoding");

    encodings = encodings.ToLower();

    if (encodings.Contains("gzip") || encodings == "*")
    {
        app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress);
        app.Response.AppendHeader("Content-Encoding", "gzip");

    }

Но, заголовки выглядят так:

Status=OK - 200
Server=ASP.NET Development Server/10.0.0.0
Date=Mon, 24 Oct 2011 09:26:37 GMT
Content-Encoding=gzip
Cache-Control=public
Etag="1CC7A09FDE77300"
Vary=*
Content-Type=application/x-javascript
Content-Length=44447
Connection=Close

(Не знаю, почему это application/x-javascript, поскольку в HTML он установлен как text/javascript, но это не имеет значения. )

Как вы можете видеть, теперь у меня есть заголовок vary, но он установлен как Vary=*, а не Vary=Accept-Encoding, как вы ожидаете от моего кода в модуле сжатия.

Что здесь происходит? Как мне правильно установить заголовок Vary?

Second Edit: Я собираюсь вставить исходный код всего класса. Там не намного больше, чем я уже выложил, но это может помочь понять, что именно я делаю:

public class HttpCompressionModule : IHttpModule
{
    /// 
    /// Initializes a new instance of the  class.
    /// 
    public HttpCompressionModule()
    {
    }

    #region IHttpModule Members

    /// 
    /// Disposes of the resources (other than memory) used by the module that implements .
    /// 
    void IHttpModule.Dispose()
    {

    }

    /// 
    /// Initializes a module and prepares it to handle requests.
    /// 
    /// An  that provides access to the methods, properties, and events common to all application objects within an ASP.NET application
    void IHttpModule.Init(HttpApplication context)
    {
        context.BeginRequest += (new EventHandler(this.context_BeginRequest));
    }

    #endregion

    /// 
    /// Handles the BeginRequest event of the context control.
    /// 
    /// The source of the event.
    /// The  instance containing the event data.
    void context_BeginRequest(object sender, EventArgs e)
    {            
        HttpApplication app = (HttpApplication)sender;
        string encodings = app.Request.Headers.Get("Accept-Encoding");
        Stream baseStream = app.Response.Filter;


        if (string.IsNullOrEmpty(encodings))
            return;


        string url = app.Request.RawUrl.ToLower();

        if (url.Contains(".js") || url.Contains(".css") || url.Contains("ajax.ashx"))
        {
            app.Response.Cache.SetVaryByCustom("Accept-Encoding");

            encodings = encodings.ToLower();

            if (encodings.Contains("gzip") || encodings == "*")
            {
                app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress);
                app.Response.AppendHeader("Content-Encoding", "gzip");

            }
            else if (encodings.Contains("deflate"))
            {
                app.Response.Filter = new DeflateStream(baseStream, CompressionMode.Compress);
                app.Response.AppendHeader("Content-Encoding", "deflate");
            }
        }
    }
}

Далее, вот секция System.Web моего файла web.config:


    
    
    
    
    
    
    
    
    
        
            
            
        
    
    
    
        
            
            
        
    
    
    
    
        
        
    
    
        
    

Больше сказать нечего. Никаких других нестандартных вещей, которые мы делаем с сайтом, я не знаю. Есть идеи?

10
задан Community 23 May 2017 в 12:33
поделиться