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

文章目录

    问题描述

    在开发一个 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式