Я работаю над механизмом сжатия и кэширования в моем приложении asp.net mvc 5.
Я отправляю файлы со следующими заголовками кэша:
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(DateTime.UtcNow.AddYears(1).ToUniversalTime());
Response.Cache.SetLastModified(System.IO.File.GetLastWriteTime(serverPath).ToUniversalTime());
Response.AppendHeader("Vary", "Accept-Encoding");
IE11,Edge, Firefox, все отправляют заголовок If-Modified-Since при обновлении F5, но не Chrome.Почему это так и как это обойти?В Chrome я получил 200 кодов состояния и файл загружен из кеша.
Вторая проблема, с которой я столкнулся, - включение сжатия gzip.У меня есть стандартный фильтр действий для этого:
public class CompressContentMvcAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
GZipEncodePage();
}
private bool IsGZipSupported()
{
string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
if (!string.IsNullOrEmpty(AcceptEncoding) &&
(AcceptEncoding.Contains("gzip") || AcceptEncoding.Contains("deflate")))
{
return true;
}
return false;
}
private void GZipEncodePage()
{
HttpResponse Response = HttpContext.Current.Response;
if (IsGZipSupported())
{
string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
if (AcceptEncoding.Contains("gzip"))
{
Response.Filter = //new GZipCompressionService().CreateCompressionStream(Response.Filter);
new System.IO.Compression.GZipStream(Response.Filter,
System.IO.Compression.CompressionMode.Compress);
Response.Headers.Remove("Content-Encoding");
Response.AppendHeader("Content-Encoding", "gzip");
}
else
{
Response.Filter =// new DeflateCompressionService().CreateCompressionStream(Response.Filter);
new System.IO.Compression.DeflateStream(Response.Filter,
System.IO.Compression.CompressionMode.Compress);
Response.Headers.Remove("Content-Encoding");
Response.AppendHeader("Content-Encoding", "deflate");
}
}
// Allow proxy servers to cache encoded and unencoded versions separately
Response.AppendHeader("Vary", "Content-Encoding");
}
}
Я применяю этот фильтр к своему методу действия, возвращающему активы приложения, но он получил Transfer-Encoding: chunked для каждого файла, а не gziped.Этот фильтр скопирован из моего предыдущего проекта, и ожидается, что он все еще работает.Может ли быть проблема с сервером IIS?Локально у меня есть IIS 10 и .NET 4.7, старое приложение, в котором оно работает, размещено на IIS 8.5 и framework 4.5.Не могу думать ни о чем другом.Я гуглю второй день и не могу найти подсказки.Меня не интересует сжатие в IIS.
[править]
Заголовок, полученный из ответа:
HTTP/1.1 200 OK
Cache-Control: public
Content-Type: text/javascript
Expires: Sat, 18 May 2019 08:58:48 GMT
Last-Modified: Thu, 10 May 2018 13:26:02 GMT
Vary: Content-Encoding
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 18 May 2018 08:58:48 GMT
Transfer-Encoding: chunked