Существует ли способ, которым я могу Программно установить, Истекает Заголовок в коде с ASP.NET? Конкретно я должен установить его на всей папке и всех подпапках, и папка содержит только статические файлы (JavaScript, CSS, Изображения и т.д.) и не aspx файлы, таким образом, я не могу только добавить некоторый код к коду aspx - позади page_load.
Я могу обычно устанавливать это непосредственно в IIS. Но сервер заблокирован вниз клиентом (у меня только есть доступ FTP к каталогу веб-приложения для развертывания), и то, чтобы заставлять клиент установить Истекает, Заголовок на IIS взял бы ледниковый период (это - государственный сектор / правительственный сайт).
Я делаю это по причинам оптимизации Фронтенда согласно рекомендациям 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, истекает, значение не устанавливается. Заметьте, что я использую 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, я мог бы просто установить Далекое будущее, Истекает заголовок непосредственно и не беспокойство с этим HttpModule. О, хорошо!
Если вы используете IIS 7, самый простой способ сделать это - написать HttpModule, который запускается для статических файлов в интегрированном режиме, и установить оттуда заголовки Expires и Cache-Control. .
Обновление:
Ваш HttpModule должен работать, хотя обычно я также вызываю:
context.Response.Cache.SetMaxAge(TimeSpan.FromDays(365.));
Обновление 2:
В IIS 6 вам придется программно изменять метабазу. Это возможно, хотя для этого требуются повышенные разрешения.
Единственный другой вариант - написать модуль ISAPI на C ++.
Хорошие способы повышения производительности включают: сжатие ответов с помощью gzip (не самый простой с IIS6), минимизацию статических файлов (css, js), объединение статических файлов вместе ( один большой css, один большой js), используя спрайты. Идея состоит в том, чтобы уменьшить общее количество HTTP-запросов, а затем уменьшить размер ответов.