змушуйте браузери отримувати найновіші файли js та css у програмі asp.net


104

Деякі браузери кешують файли js та css, не вдається оновити їх, якщо не змусити їх. Що найпростіше.

Я щойно реалізував це рішення, яке, здається, працює.

Оголосіть змінну версії на своїй сторінці

  public string version { get; set; }

Отримайте номер версії з ключа web.config

 version = ConfigurationManager.AppSettings["versionNumber"];

На своїй сторінці aspx виконайте дзвінки в javascript та таблиці стилів так

<script src="scripts/myjavascript.js?v=<%=version %>" type="text/javascript"></script>
<link href="styles/mystyle.css?v=<%=version %>" rel="stylesheet" type="text/css" />

Тож якщо ви встановите версію = 1.1 з 1.0 у своєму web.config, ваш браузер завантажить найновіші файли, які, сподіваємось, врятують вас і ваших користувачів деякі розчарування.

Чи є інше рішення, яке працює краще, чи це спричинить якісь непередбачені проблеми для веб-сайту?


Цікаве питання, у мене був той самий випуск нещодавно, але він був лише проблемою під час тестування розробок. Не надто переймалися цим питанням, оскільки ми не збираємось змінювати ці файли після запуску. Хочеться знати рішення, хоча для подальшої довідки!
Бретт Аллен

Єдине питання, яке я бачу, - це те, що зміни в web.config на задньому плані викликають перезапуск програми: msdn.microsoft.com/en-us/library/aa478432.aspx
monty

Дякую за запитання. Це допомогло мені вирішити велике питання.
Редді

Відповіді:


76

Я вирішив це, позначивши останню змінену часову позначку як параметр запиту до сценаріїв.

Я робив це за допомогою методу розширення та використовував його у своїх файлах CSHTML. Примітка. Ця реалізація кешує часову позначку протягом 1 хвилини, тому ми не так сильно обробляємо диск.

Ось метод розширення:

public static class JavascriptExtension {
    public static MvcHtmlString IncludeVersionedJs(this HtmlHelper helper, string filename) {
        string version = GetVersion(helper, filename);
        return MvcHtmlString.Create("<script type='text/javascript' src='" + filename + version + "'></script>");
    }

    private static string GetVersion(this HtmlHelper helper, string filename)
    {
        var context = helper.ViewContext.RequestContext.HttpContext;

        if (context.Cache[filename] == null)
        {
            var physicalPath = context.Server.MapPath(filename);
            var version = $"?v={new System.IO.FileInfo(physicalPath).LastWriteTime.ToString("MMddHHmmss")}";
            context.Cache.Add(filename, version, null,
              DateTime.Now.AddMinutes(5), TimeSpan.Zero,
              CacheItemPriority.Normal, null);
            return version;
        }
        else
        {
            return context.Cache[filename] as string;
        }
    }
}

А потім на сторінці CSHTML:

 @Html.IncludeVersionedJs("/MyJavascriptFile.js")

У виведеному HTML це відображається як:

 <script type='text/javascript' src='/MyJavascriptFile.js?20111129120000'></script>

1
це чудово підходить для mvc, мені цікаво, чи останній mvc 5 фреймворк вирішує це питання? Підхід, який використовується в пакеті - {версія} wildcard - це також спосіб вирішити цю проблему, проте він вимагає перейменування файлів після кожної нової збірки ...
kiev

Я використовую основи вашого прикладу MVC на веб-сайті веб-форм, і він чудово працює, тому дякую вам за обмін!
Брайан

Чи має бути якась причина для занепокоєння щодо відображення останнього зміненого штампа дати / часу для файлів ресурсів? Якщо на використовуваному файлі відмічали печатку дати / часу кілька років, чи може бути інформація про те, що компанія може не хотіти бути публічною для своїх користувачів?
Брайан

Це стандартний спосіб, в основному наступні програми. Але ця мітка часу повинна змінюватися лише тоді, коли ви розгортаєте або створюєте свою програму. В іншому випадку кожен раз оновлення сторінки або перехід на інші сторінки вашої програми. Браузер знову завантажить усі ваші таблиці таблиць стилів і javascript, що не годиться
Tarun

2
Який вплив на продуктивність сторінки? Скільки затримок може спричинити завантаження сторінки?
Durgesh Sonawane

28

Ваше рішення працює. Насправді це досить популярно.

Навіть переповнення стека використовує аналогічний метод:

<link rel="stylesheet" href="http://sstatic.net/so/all.css?v=6184"> 

Де v=6184, мабуть, номер редакції SVN.


Це був би набагато більше підхід до оподаткування, ніж той, який описаний у прийнятій відповіді. Перевірка SVN-версії файлу кожного разу, коли сторінка розміщується, є надмірною ефективністю, тим більше, що з часом кількість користувачів збільшується.
Неоліск

4
Ви можете отримати ревізійний номер під час складання, записати його у файл (наприклад, частковий файл .cs), включити цей файл у свій проект, тому вам не потрібно читати його зі svn під час виконання. Я використовував цей підхід з msbuild, щоб розмістити номери ревізії у своїх файлах AssemblyInfo.cs з svn.
Рамазан Бінарбасі

2
Використання глобального номера версії / версії має щонайменше один недолік: публікація оновлення веб-сайту приводить до недійсного кешування браузера для всіх файлів .js та .css, а не лише тих, що змінилися. Це, мабуть, не має значення для більшості програм, але я згадую це для повноти.
Адам Теген

Якщо ви оновлюєте версію файлів Assemblyinfo.cs автоматично під час розгортання або складання, для цієї кількості може бути використана другорядна версія.
Крістіанп

28

У ASP.NET Core (MVC 6) це працює поза коробкою через asp-append-versionпомічник тегів:

<script src="scripts/myjavascript.js" asp-append-version="true"></script>
<link href="styles/mystyle.css rel="stylesheet" asp-append-version="true" />

1
Дякуємо, що повідомили нам! Я цього раніше не знав!
Федеріко Наваррете

18

ASP.NET MVC вирішить це за вас, якщо ви використовуєте пакети для свого JS / CSS. Він автоматично додає номер версії у вигляді GUID до ваших пакетів і оновлює цей GUID лише тоді, коли пакет буде оновлено (так само будь-який з вихідних файлів має зміни).

Це також допомагає, якщо у вас є тонна файлів JS / CSS, оскільки це може значно покращити завантаження вмісту!

Дивіться тут


Ви маєте на увазі, що якщо ми використовуємо пакети в додатку MVC, тут не потрібен жоден із методів у розміщеній відповіді? Якщо так, то згуртування дійсно набагато важливіше, що я коли-небудь думав. Не могли б ви пояснити нам це питання? Дякую.
Джек

1
Так, саме. Поки ваші сценарії включаються в комплект, він автоматично генерує номер версії для кожного пакета, коли виявляться зміни в будь-якому з вихідних файлів цього пакета.
jonesy827

І не забувайте, що у вас все ще болить голова як розробник. Пакет ASP.NET допомагає ніколи під час налагодження та розробки.
it3xl

12

Для цього є вбудований спосіб в asp.net: поєднання . Просто використовуйте його. Кожна нова версія матиме унікальний суфікс "? V = XXXXXXX". У режимі налагодження пакетне вимкнення, щоб увімкнути налаштування make в web.config:

<system.web>
    <compilation debug="false" />
</system.web>

Або додати до методу RegisterBundles (розшарування BundleCollection):

BundleTable.EnableOptimizations = true;

Наприклад:

BundleConfig.cs:

bundles.Add(new ScriptBundle("~/Scripts/myjavascript.js")
                .Include("~/Scripts/myjavascript.js"));

bundles.Add(new StyleBundle("~/Content/mystyle.css")
                .Include("~/Content/mystyle.css"));

_Layout.cshtml:

@Scripts.Render("~/Scripts/myjavascript.js")
@Styles.Render("~/Content/mystyle.css")

Але це працюватиме лише у випуску чи виробничих середовищах. Що з розробкою, коли ввімкнено режим налагодження? Чи пакет вирішує цю проблему?
VAAA

Так, bundlind не сприяє розробникам жити легше. Вам потрібно натиснути Ctrl-F5 після кожної зміни сценарію. А якщо у вас є кадри, це буде ще смішніше.
it3xl

6

На це є простіша відповідь, ніж відповідь, яку надає оп у запитанні (підхід той самий):

Визначте ключ у web.config:

<add key="VersionNumber" value="06032014"/>

Здійсніть заклик до програм безпосередньо зі сторінки aspx:

<link href="styles/navigation.css?v=<%=ConfigurationManager.AppSettings["VersionNumber"]%>" rel="stylesheet" type="text/css" />

Мені це подобається, але мене хвилює, чому за це рішення так мало голосів ...
SimplyInk

@SimplyInk Я не знаю, але є 20 різних відповідей, так що це може щось робити з цим. Якщо це працює і вам це подобається, сміливо заявляйте про це.
JackArbiter

4

На основі відповіді Адама Тегана , модифікованого для використання в додатку веб-форм.

У коді класу .cs:

public static class FileUtility
{
    public static string SetJsVersion(HttpContext context, string filename) {
        string version = GetJsFileVersion(context, filename);
        return filename + version;
    }

    private static string GetJsFileVersion(HttpContext context, string filename)
    {
        if (context.Cache[filename] == null)
        {
            string filePhysicalPath = context.Server.MapPath(filename);

            string version = "?v=" + GetFileLastModifiedDateTime(context, filePhysicalPath, "yyyyMMddhhmmss");

            return version;
        }
        else
        {
            return string.Empty;
        }
    }

    public static string GetFileLastModifiedDateTime(HttpContext context, string filePath, string dateFormat)
    {
        return new System.IO.FileInfo(filePath).LastWriteTime.ToString(dateFormat);
    }
}

У розмітці aspx:

<script type="text/javascript" src='<%= FileUtility.SetJsVersion(Context,"/js/exampleJavaScriptFile.js") %>'></script>

І у виведеному HTML він відображається як

<script type="text/javascript" src='/js/exampleJavaScriptFile.js?v=20150402021544'></script>

2
Гей! Ваш приклад працює, але вам слід або видалити посилання кешування, або виправити код, щоб використовувати кеш, оскільки це може заплутати, чому ви його використовуєте. Щоб використовувати кеш, слід додати версію файлу в кеш, використовуючи метод context.Cache.Add у випадку case.Cache [ім'я файлу] == null. Якщо context.Cache [ім'я файлу]! = Null, ви повинні повернути кешоване значення (context.Cache [ім'я файлу])
Flavia Obreja

1
Флавія, я вважаю, що ваше пояснення має сенс, і я думаю, що це простіша, ефективніша реалізація. Дякуємо за публікацію корисних коментарів та відгуків.
Брайан

4

Цікаво, що цей веб-сайт має проблеми з описом, який ви описуєте, у зв'язку з деякими налаштуваннями проксі-серверів, навіть якщо це має бути безпечно.

Перевірте цю дискусію щодо переповнення Meta Stack .

Отже, з огляду на це, можливо, має сенс використовувати для оновлення не параметр GET, а власне ім’я файлу:

href="/css/scriptname/versionNumber.css" 

навіть якщо це більше роботи, тому що вам доведеться фактично створити файл або створити для нього перезапис URL-адрес.


4

Я хотів простий один вкладиш, щоб зробити шлях унікальним для заповнення кешу. Це працювало для мене:

<script src="scripts/main.js?bust_js_cache=<%=System.IO.File.GetLastWriteTime(Server.MapPath("scripts/main.js")).ToString("HH:mm:ss")%>" type="text/javascript"></script>

Якщо файл було змінено з моменту останнього завантаження на сторінку, браузер витягне оновлений файл.

Він генерує last modifiedмарку з .jsфайлу і вводить її туди замість версії, до якої може бути непросто отримати доступ.

<script src="scripts/main.js?bust_js_cache=10:18:38" type="text/javascript"></script>

Іншим варіантом може бути отримання контрольної суми файлу.


1
На сьогодні найпростіший спосіб зробити це, і, мабуть, найнижчі накладні.
Тоні Хінкл

1
Ідеальне рішення. Я також протестував Chrome 70, Firefox 63 та IE 11, щоб переконатися, що кешування справді працює. Це є. Це припускає кешування лише нових версій файлу, принаймні, на останніх версіях браузерів. Я чула згадку про те, що деякі веб-переглядачі перезавантажують кожен файл запитом (?). Можливо, це було так, а може, це все-таки правда для Safari та Opera. ДК.
Бред Метюз

3

Ось підхід, який працює з ASP.NET 5 / MVC 6 / vNext .

Крок 1. Створіть клас, щоб повернути останній час запису файлу, подібно до інших відповідей у ​​цій темі. Зауважте, для цього потрібне введення залежності ASP.NET 5 (або іншого).

public class FileVersionService
{
    private IHostingEnvironment _hostingEnvironment;
    public FileVersionService(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }

    public string GetFileVersion(string filename)
    {
       var path = string.Format("{0}{1}", _hostingEnvironment.WebRootPath, filename);
       var fileInfo = new FileInfo(path);
       var version = fileInfo.LastWriteTimeUtc.ToString("yyyyMMddhhmmssfff");
       return version;
     }
}

Крок 2: Зареєструйте службу, яку потрібно вводити всередині startup.cs :

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddScoped<FileVersionService>();
    ...
}

Крок 3: Тоді в ASP.NET 5 можна ввести службу безпосередньо у вигляд макета, такий як _Layout.cshtml, як це:

@inject Namespace.Here.FileVersionService fileVersionService
<!DOCTYPE html>
<html lang="en" class="@ViewBag.HtmlClass">
<head>
    ...
    <link href="/css/styles.css?v=@fileVersionService.GetFileVersion("\\css\\styles.css")" rel="stylesheet" />
    ...
</head>
<body>
    ...
</body>

Існує кілька завершальних штрихів, які можна зробити, щоб краще поєднати фізичні шляхи та обробити ім'я файлу у стилі, більш відповідає синтаксису, але це вихідний момент. Сподіваємось, це допомагає людям, що переходять на ASP.NET 5.


ця поведінка насправді підтримується нестандартно, дивіться мою відповідь
metalheart

3

Я використовував дещо іншу техніку на своєму сайті aspnet MVC 4:

_ViewStart.cshtml:

@using System.Web.Caching
@using System.Web.Hosting
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    PageData.Add("scriptFormat", string.Format("<script src=\"{{0}}?_={0}\"></script>", GetDeployTicks()));
}

@functions
{

    private static string GetDeployTicks()
    {
        const string cacheKey = "DeployTicks";
        var returnValue = HttpRuntime.Cache[cacheKey] as string;
        if (null == returnValue)
        {
            var absolute = HostingEnvironment.MapPath("~/Web.config");
            returnValue = File.GetLastWriteTime(absolute).Ticks.ToString();
            HttpRuntime.Cache.Insert(cacheKey, returnValue, new CacheDependency(absolute));
        }
        return returnValue;
    }
}

Потім у фактичних переглядах:

 @Scripts.RenderFormat(PageData["scriptFormat"], "~/Scripts/Search/javascriptFile.min.js")

3

<?php $rand_no = rand(10000000, 99999999)?> <script src="scripts/myjavascript.js?v=<?=$rand_no"></script>

Це працює для мене у всіх браузерах. Тут я використовував PHP для генерації випадкових ні. Ви можете використовувати свій власний бік сервера. "


Приємна відповідь, але ASP MVC може бути дещо проблематичним, якщо ви не враховуєте, що пояснив Адам, тому що я спробував це, і папка Bundle не розпізнає його, якщо ви працюєте з MVC 5. Але дякую за пропозицію!
Федеріко Наваррете

2

Починаючи з вищенаведеної відповіді, я трохи змінив код, щоб змусити помічників працювати з файлами CSS і додавати версію кожного разу, коли ви вносите якісь зміни у файли, а не лише коли ви збираєтеся

public static class HtmlHelperExtensions
{
    public static MvcHtmlString IncludeVersionedJs(this HtmlHelper helper, string filename)
    {
        string version = GetVersion(helper, filename);
        return MvcHtmlString.Create("<script type='text/javascript' src='" + filename + version + "'></script>");
    }

    public static MvcHtmlString IncludeVersionedCss(this HtmlHelper helper, string filename)
    {
        string version = GetVersion(helper, filename);
        return MvcHtmlString.Create("<link href='" + filename + version + "' type ='text/css' rel='stylesheet'/>");
    }

    private static string GetVersion(this HtmlHelper helper, string filename)
    {
        var context = helper.ViewContext.RequestContext.HttpContext;
        var physicalPath = context.Server.MapPath(filename);
        var version = "?v=" +
        new System.IO.FileInfo(physicalPath).LastWriteTime
        .ToString("yyyyMMddHHmmss");
        context.Cache.Add(physicalPath, version, null,
          DateTime.Now.AddMinutes(1), TimeSpan.Zero,
          CacheItemPriority.Normal, null);

        if (context.Cache[filename] == null)
        {
            context.Cache[filename] = version;
            return version;
        }
        else
        {
            if (version != context.Cache[filename].ToString())
            {
                context.Cache[filename] = version;
                return version;
            }
            return context.Cache[filename] as string;
        }
    }
}

1

Отримати модифікований час файлу, як показано нижче

private static string GetLastWriteTimeForFile(string pathVal)
    {
        return System.IO.File.GetLastWriteTime(HostingEnvironment.MapPath(pathVal)).ToFileTime().ToString();
    }

Додайте це введенням як рядок запитів

public static string AppendDateInFile(string pathVal)
    {
        var patheWithDate = new StringBuilder(pathVal);
        patheWithDate.AppendFormat("{0}x={1}",
                               pathVal.IndexOf('?') >= 0 ? '&' : '?',
                               GetLastWriteTimeForFile(pathVal));
        return patheWithDate.ToString();
    }

Викликати це за допомогою розмітки.

Підхід для допоміжних служб MVC

Додати метод розширення

namespace TNS.Portal.Helpers
{
    public static class ScriptExtensions
    {
        public static HtmlString QueryStringScript<T>(this HtmlHelper<T> html, string path)
        {
            var file = html.ViewContext.HttpContext.Server.MapPath(path);
            DateTime lastModified = File.GetLastWriteTime(file);
            TagBuilder builder = new TagBuilder("script");
            builder.Attributes["src"] = path + "?modified=" + lastModified.ToString("yyyyMMddhhmmss");
            return new HtmlString(builder.ToString());
        }

       public static HtmlString QueryStringStylesheet<T>(this HtmlHelper<T> html, string path)
       {
        var file = html.ViewContext.HttpContext.Server.MapPath(path);
        DateTime lastModified = File.GetLastWriteTime(file);
        TagBuilder builder = new TagBuilder("link");
        builder.Attributes["href"] = path + "?modified=" + lastModified.ToString("yyyyMMddhhmmss");
        builder.Attributes["rel"] = "stylesheet";
        return new HtmlString(builder.ToString());
      }

    }
}

Додайте це простір імен у web.config

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="TNS.Portal" />
        <add namespace="TNS.Portal.Helpers" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

Використовуйте його з точки зору як

@Html.QueryStringScript("/Scripts/NPIAjaxCalls.js")
@Html.QueryStringStylesheet("/Content/StyledRadio.css")

1

Спрощені попередні пропозиції та надання коду для розробників .NET Web Forms.

Це прийме як відносні ("~ /"), так і абсолютні URL-адреси на шляху файлу до ресурсу.

Помістіть у файл класу статичних розширень такі:

public static string VersionedContent(this HttpContext httpContext, string virtualFilePath)
{
    var physicalFilePath = httpContext.Server.MapPath(virtualFilePath);
    if (httpContext.Cache[physicalFilePath] == null)
    {
        httpContext.Cache[physicalFilePath] = ((Page)httpContext.CurrentHandler).ResolveUrl(virtualFilePath) + (virtualFilePath.Contains("?") ? "&" : "?") + "v=" + File.GetLastWriteTime(physicalFilePath).ToString("yyyyMMddHHmmss");
    }
    return (string)httpContext.Cache[physicalFilePath];
}

А потім зателефонуйте на свою Головну сторінку як таку:

<link type="text/css" rel="stylesheet" href="<%= Context.VersionedContent("~/styles/mystyle.css") %>" />
<script type="text/javascript" src="<%= Context.VersionedContent("~/scripts/myjavascript.js") %>"></script>

Гарний підхід теж!
Федеріко Наваррете

0

На підставі вищевказаної відповіді я написав невеликий клас розширення для роботи з файлами CSS та JS:

public static class TimestampedContentExtensions
{
    public static string VersionedContent(this UrlHelper helper, string contentPath)
    {
        var context = helper.RequestContext.HttpContext;

        if (context.Cache[contentPath] == null)
        {
            var physicalPath = context.Server.MapPath(contentPath);
            var version = @"v=" + new FileInfo(physicalPath).LastWriteTime.ToString(@"yyyyMMddHHmmss");

            var translatedContentPath = helper.Content(contentPath);

            var versionedContentPath =
                contentPath.Contains(@"?")
                    ? translatedContentPath + @"&" + version
                    : translatedContentPath + @"?" + version;

            context.Cache.Add(physicalPath, version, null, DateTime.Now.AddMinutes(1), TimeSpan.Zero,
                CacheItemPriority.Normal, null);

            context.Cache[contentPath] = versionedContentPath;
            return versionedContentPath;
        }
        else
        {
            return context.Cache[contentPath] as string;
        }
    }
}

Замість того, щоб написати щось на кшталт:

<link href="@Url.Content(@"~/Content/bootstrap.min.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content(@"~/Scripts/bootstrap.min.js")"></script>

Тепер ви можете написати:

<link href="@Url.VersionedContent(@"~/Content/bootstrap.min.css")" rel="stylesheet" type="text/css" />
<script src="@Url.VersionedContent(@"~/Scripts/bootstrap.min.js")"></script>

Тобто просто замінити Url.Contentна Url.VersionedContent.

Створені URL-адреси виглядають приблизно так:

<link href="/Content/bootstrap.min.css?v=20151104105858" rel="stylesheet" type="text/css" />
<script src="/Scripts/bootstrap.min.js?v=20151029213517"></script>

Якщо ви використовуєте клас розширення, ви можете додати обробку помилок у випадку, якщо MapPathвиклик не працює, оскільки contentPathце не фізичний файл.


0

Я використовую подібний спосіб зробити те саме, що ви робите, не змінюючи кожної сторінки. Додано подію PreRender - головний файл. Це зберігає мою логіку в одному місці і застосовно до файлів js та css.

protected void Page_PreRender(object sender, EventArgs e)
    {
        HtmlLink link = null;
        LiteralControl script = null;


        foreach (Control c in Header.Controls)
        {
            //StyleSheet add version
            if (c is HtmlLink)
            {
                link = c as HtmlLink;


                if (link.Href.EndsWith(".css", StringComparison.InvariantCultureIgnoreCase))
                {
                    link.Href += string.Format("?v={0}", ConfigurationManager.AppSettings["agVersion"]);
                }

            }

            //Js add version
            if (c is LiteralControl)
            {
                script = c as LiteralControl;

                if (script.Text.Contains(".js"))
                {
                    var foundIndexes = new List<int>();


                    for (int i = script.Text.IndexOf(".js\""); i > -1; i = script.Text.IndexOf(".js\"", i + 1))
                    {

                        foundIndexes.Add(i);
                    }

                    for (int i = foundIndexes.Count - 1; i >= 0; i--)
                    {

                        script.Text = script.Text.Insert(foundIndexes[i] + 3, string.Format("?v={0}", ConfigurationManager.AppSettings["agVersion"]));
                    }
                }

            }

        }
    }

0

Ви можете змінити властивість DefaultTagFormat у сценаріїв або стилів.

Scripts.DefaultTagFormat = @"<script src=""{0}?v=" + ConfigurationManager.AppSettings["pubversion"] + @"""></script>";
Styles.DefaultTagFormat = @"<link href=""{0}?v=" + ConfigurationManager.AppSettings["pubversion"] + @""" rel=""stylesheet""/>";

0

Для вирішення цієї проблеми в моєму додатку ASP.Net Ajax я створив розширення, а потім зателефонував на головну сторінку.

Для отримання більш детальної інформації ви можете перейти за посиланням .


0

Простий та розумний спосіб впровадити версію css у застосуванні .net за нижченаведеною концепцією .. не потрібно писати бек-енд-код.

<link href="<%="../../App_Themes/Base/css/main.css?v="+ DateTime.Now.ToString("yyyyMMddhhmmss") +""%>" rel="stylesheet" />

це змусить завантажуватись на кожній сторінці відображення, навіть якщо файли взагалі не змінилися.
Танасіс Іоанідіс

@ThanasisIoannidis Він може використовувати там, де файли регулярно змінюються. інший варіант - додати ключ appVersion у web.config та використовувати з ім'ям файлів .., але вам потрібно оновити, коли ви випустите програму для prod.
СантошК

-1

Основна проблема з цим способом полягає в основному в тому, що вам потрібно буде пам’ятати, щоб оновлювати номер своєї версії у коді кожного разу, коли ви вносите будь-які зміни у свої файли css чи js.

Можливо, кращий спосіб зробити це - встановити гарантований унікальний параметр для кожного з ваших файлів css або js, наприклад:

<script src="scripts/myjavascript.js?_=<%=DateTime.Now.Ticks%>" type="text/javascript"></script>
<link href="styles/mystyle.css?_=<%=DateTime.Now.Ticks%>" rel="stylesheet" type="text/css" />

Це змушує кожного разу запитувати файли з сервера, що також означає, що ваш сайт не буде таким ефективним при завантаженні сторінки, оскільки ці файли ніколи не будуть кешовані, і кожен раз буде використовувати непотрібну пропускну здатність.

По суті, якщо ви можете пам’ятати оновлювати номер версії щоразу, коли вноситься зміна, ви можете піти з того, як це робите.


9
і також використовує велику кількість пропускної здатності.
Даррен Копп

2
Правильно, ви не бажаєте нової версії JS при кожному завантаженні сторінки ... ви просто хочете, щоб браузер шукав нову версію кожного разу, коли у вас є фактично оновлена ​​версія.
kingdango

Це цілком прийнятно для тимчасового рішення у файлі css розміром 50 КБ під час розробки. +1
Колбс

-2

Для сторінок ASP.NET я використовую наступне

ПЕРЕД

<script src="/Scripts/pages/common.js" type="text/javascript"></script>

ПІСЛЯ (примусове перезавантаження)

 <script src="/Scripts/pages/common.js?ver<%=DateTime.Now.Ticks.ToString()%>" type="text/javascript"></script>

Додавання DateTime.Now.Ticks працює дуже добре.


так, проблема з пропускною здатністю - як у коментарях вище stackoverflow.com/a/2185918/59508
київ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.