ASP.NET Core 8.0 asp-append-version 自动添加版本号失败

更新日期: 2024-10-12 阅读次数: 90 字数: 593 分类: Windows

问题描述

在开发一个 ASP.NET Core 8.0 的网站,使用 asp-append-version 自动给 js 和 css 文件添加版本号。 代码如下:

<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />

之前还是好的,但是不知道啥时候,就不好用了。即,没有后面的版本号了(文件 hash)

问题根源

为了方便 Nginx 转发 /tools4 的请求到这个 ASP.NET Core 的服务上,我统一添加了前缀。

而版本号的计算,是基于文件进行计算的,而文件的目录是相对 wwwroot 的地址。

所以,我手动添加了前缀之后,虽然能在浏览器中访问,但是,在计算版本号时,基于这个路径就找不到对应的文件了。

例如,我设置的前缀是 tools4

<link rel="stylesheet" href="~/tools4/css/site.css" asp-append-version="true" />

这个前缀就是问题的根源。

Program.cs 设置 app.UsePathBase

例如:

app.UsePathBase("/tools4");  // 新添加

app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(...);

这样就统一加上前缀了。

也就不再需要之前繁琐的 MapGroup 及 wwwroot StaticFile RequestPath 配置了。

测试

这样修改之后,确实正常了。比较奇怪的是,加不加前缀都是支持的。。。 即,下面两个链接都能正常访问。

  • http://localhost:5000/tools4
  • http://localhost:5000

且 wwwroot 下的静态文件都做了对应处理。

StackOverflow 上有个同样的问题,我看 github 上也有人提到了,但是没有回答。

https://stackoverflow.com/questions/77991947/net-core-usepathbase-why-original-route-still-working

这个可以暂时忽略,因为并不影响我目前的使用。

版本号格式

cshtml 中的代码:

<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />

对应的生成格式:

http://localhost:5000/css/site.css?v=KLjfQfNTfT6FLjPvGFVN500tbbJKDcPi9EpAGZuRf_g
http://localhost:5000/tools4/css/site.css?v=KLjfQfNTfT6FLjPvGFVN500tbbJKDcPi9EpAGZuRf_g

注意,加了前缀的和不加前缀的链接,都能正常访问。

但是,如果用没有定义的前缀,比如 tools5 去访问,就会报 404.

appsettings.json 配置 PathBase (没有必要)

可以通过,appsettings.json 及 appsettings.Development.json, 方便的区分开发环境和生产环境。

特别是在 watch 模式下,不用手动再输入前缀了。

但是,由于加不加前缀都能正常访问,所以在开发调试的时候,也就没有必要单独再指定一个 PathBase 为 / 的情况了。

参考

  • https://stackoverflow.com/questions/56055697/how-to-change-base-url
  • https://www.jianshu.com/p/1562db5d2b28

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式

tags: dotnet