Является ли AddTimestampToStaticLinks медленным?

T4MVC имеет параметр AddTimestampToStaticLinks, который добавляет время последнего изменения файла URL:

/Content/nerd.jpg?2009-09-04T12:25:48

Это очень удобно при разработке, так как часто изменяемые файлы не кэшируются браузером. Но я должен держать это для производства? Насколько это медленно? Я даже не уверен, как это работает. Кто делает магию преобразования "/Content/nerd.jpg?2009-09-04T12:25:48" в "/Content/nerd.jpg"? Некоторые из модулей IIS?

1 ответ

Решение

Должен ли я сохранить его для производства?

Да. Это дает вашим пользователям те же преимущества, которые вы получаете при разработке.

Насколько это медленно? Я даже не уверен, как это работает.

У меня нет времени, но это, вероятно, слишком быстро для ваших целей. Он проверяет дату последнего изменения в реальном файле, генерирует хэш разницы в числе тиков и использует конкатенацию строк для добавления ее в URL. Вы можете проверить себя, потому что шаблоны t4 - это просто текстовые файлы. Код для этого выглядит следующим образом:

static DateTime CenturyBegin=new DateTime(2001,1,1);
public static string TimestampString(string virtualPath) {
    if (!HostingEnvironment.IsHosted) return string.Empty;
    string filePath = HostingEnvironment.MapPath(virtualPath);
    return Convert.ToString((System.IO.File.GetLastWriteTimeUtc(filePath).Ticks-CenturyBegin.Ticks)/1000000000,16);            
}

Если это не достаточно быстро для ваших целей, вы можете изменить метод, который добавляет метку времени к чему-то достаточно быстрому для вас. Менее точные, но более быстрые методы будут похожи на номер сборки сборки или что-то, что вы меняете вручную в процессе сборки. Придерживаясь значения по умолчанию, вы сделаете так, что только файлы, которые были изменены, будут кешированы как недействительные.

Кто делает магию преобразования "/Content/nerd.jpg?2009-09-04T12:25:48" в "/Content/nerd.jpg"?

С помощью HTTP вы можете добавить строку запроса к любому запросу. Большинство реализаций сервера просто игнорируют строку запроса для статических файлов, однако они обрабатывают разные строки запроса как отдельные запросы, следовательно, получают обновления, как только они сделаны.

Даже если вы не измените файл, вы можете заставить браузеры перезагружать содержимое, просто изменив строку запроса url + на то, что клиент не кэшировал.

Другие вопросы по тегам