Есть ли способ, которым я могу программно установить заголовок Expires в коде с ASP.NET? В частности, мне нужно установить его на всю папку и все подпапки, и папка содержит только статические файлы (JavaScript, CSS, изображения и т. Д.), А не файлы aspx, поэтому я не могу просто добавить некоторый код в код aspx - за загрузкой страницы.
Обычно я могу установить это непосредственно в IIS. Но сервер заблокирован клиентом (у меня есть только FTP-доступ к каталогу веб-приложения для развертываний), и получение клиентом установки заголовка Expires на IIS потребует ледникового периода (это сайт государственного сектора / правительства).
Я делаю это по соображениям Front-End в соответствии с рекомендациями Yahoo http://developer.yahoo.com/performance/rules.html#expires
Обновление: Я пытался создать HttpModule ...
public class FarFutureExpiresModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
string url = context.Request.Url.ToString();
if (url.Contains("/StaticContent/"))
{
context.Response.Cache.SetExpires(DateTime.Now.AddYears(30));
}
}
}
Хотя это не сработает. Я поместил точку останова на код, и он работает правильно. Однако, когда я анализирую необработанную информацию HTTP-заголовка в Firefox, значение expires не устанавливается. Обратите внимание, что я использую BeginRequest, но я также пытался подключиться к PostReleaseRequestState и PreSendRequestHeaders, и они, похоже, тоже не работают. Есть идеи?
Обновление 2: Хорошо, похоже, потому что я использую IIS6, HttpModules не будут работать для статических файлов, только для динамических файлов (* .aspx и т. Д.). Благодаря помощи RickNZ я разработал следующий модуль IHttpModule:
public class FarFutureExpiresModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
string url = context.Request.Url.ToString();
if (url.Contains("/StaticContent/"))
{
context.Response.Cache.SetExpires(DateTime.Now.AddYears(30));
context.Response.Cache.SetMaxAge(TimeSpan.FromDays(365.0 * 3.0));
}
}
}
... и, похоже, работает, но только на встроенном веб-сервере в Visual Studio и в IIS7 (в режиме Intergrated Pipeline). Коллега по работе упомянул настройку сопоставления подстановочных знаков на IIS6, чтобы заставить HttpModules работать со статическими файлами, но если у меня есть доступ к IIS6, я мог бы просто установить заголовок Far-Future Expires напрямую и не беспокоиться об этом HttpModule. О, хорошо!