【问题标题】:Using ASP.NET Core tag helper asp-append-version without MVC or Razor在没有 MVC 或 Razor 的情况下使用 ASP.NET Core 标签助手 asp-append-version
【发布时间】:2021-07-04 18:41:02
【问题描述】:

我们使用没有 MVC / Razor 的 ASP.NET Core(我们的客户端是基于 websockets 的 SPA),但需要通过文件更改破坏浏览器缓存,因为 Chrome 与更新 CSS/HTML 时刷新缓存不一致/JS 应用的静态文件。

标签助手 asp-append-version 会很有帮助,但它似乎只有在我们将应用程序转换为 MVC 或 Razor 时才有效,这对于这个功能来说是多余的。

尝试一下,我找不到任何关于如何在 MVC/Razor 项目之外使用它以及在 ConfigureServices 函数中设置网络服务器添加服务的文档。AddMvcCore 似乎没有在构建器中公开任何功能附加版本。

还有几个问题:

  1. 如果我们不使用 razor/MVC 并假设它可以以这种方式工作,那么通过手动添加标签助手,我们是否会因为标签助手的开销而影响 Web 服务器的性能(例如,网页是动态构建的对于每个请求)- 我们最好使用其他性能更高的方法来缓存破坏?

  2. 在我们的 javascript 应用程序中,我们将根据用户在应用程序中的选择动态加载图像/javascript,方法是创建相关的 HTML 标记,然后附加到 DoM。如果我们在附加到 DoM 之前将 asp-append-version 作为 HTML 属性添加到片段中,asp-append-version 是否可以使用这种方法?

【问题讨论】:

  • 所以你有一个 asp.net 核心项目,它在 wwwroot 中有多个静态文件。这些文件是您的 SPA 应用程序,可能会更新。此外,您还有一个名为 index.html 的静态文件,它是您的 SPA 根目录。我说的对吗?
  • @MrMoeinM,是的,这是正确的。 Microsoft 文档有点假设正在使用 razor 或 MVC。我们的应用通过 websockets 与服务器交互,不清楚 asp-append-version 如何或是否可以工作,添加它什么都不做。

标签: asp.net asp.net-mvc


【解决方案1】:

假设我们有一个 web 服务器和一个名为 app.js 的静态文件。现在考虑这些网址

http://example.com/app.js
http://example.com/app.js?v=1
http://example.com/app.js?v=2

这三个 url 指向同一个文件,因为它是一个静态文件 web 服务器忽略查询字符串,但由于 url 是不同的浏览器考虑这三个不同的文件。

asp-append-version 的作用是将文件的哈希作为查询字符串附加到文件的 url。每次更改文件内容时都会更改文件的 url。

假设我们在你的 razor 视图中有类似的东西

<img src="~/images/asplogo.png" asp-append-version="true">

它会渲染和生成类似这样的html

<img src="/images/asplogo.png?v=Kl_dqr9NVtnMdsM2MUg4qthUnWZm5T1fCEimBPWDNgM">

因为 asp-append-version 在后端计算文件的哈希值,所以不能在静态 html 中使用它。事实上,所有 razor 标签助手都会在后端生成一些 html,您需要 razor 才能使用它们。

如果您有一些每次都更改的静态文件,您可以手动更改静态 html 文件中的版本号。例如 更新 app.js 后更改

<script src="~/app.js?v=0.1"></script>    

<script src="~/app.js?v=0.2"></script>    

在您的 index.html 中

另一种方法是使用 razor 生成 html 并在源代码中使用 asp-append-version。

正如您所提到的,如果您使用 js 加载图像或其他 js 文件,您可以在每个文件的 url 末尾附加 const 版本号,当您更新文件时,您只需要更改该 const 值。

const version = 0.2;
function loadjsfile(filename){
        var fileref=document.createElement('script')
        fileref.setAttribute("type","text/javascript")
        fileref.setAttribute("src", filename + "?v=" + version)
        document.getElementsByTagName("head")[0].appendChild(fileref)
}
loadjsfile("app.js");

此方法的缺点是,如果您只更新一个文件并更改版本 const,则所有 url 都会更改,并且浏览器会再次下载所有其他文件。

【讨论】:

  • 感谢 MrMoeinM,您的回答强调了 Razor 需要渲染源以激活标签助手功能的事实
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2023-01-25
  • 2018-12-24
相关资源
最近更新 更多