Я пытаюсь добавить 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:
Больше сказать нечего. Никаких других нестандартных вещей, которые мы делаем с сайтом, я не знаю. Есть идеи?