首页 新闻 会员 周边 捐助

ASP.NET Core: 通过 CDN 引用静态文件时 asp-append-version 不工作的问题

0
悬赏园豆:30 [已解决问题] 解决于 2023-06-17 12:36

不使用 CDN,引起本地文件时,asp-append-version 可以正常工作

<link rel="Stylesheet" type="text/css" href="/css/aggsite-new.min.css" asp-append-version="true" />

改为通过 CDN 引用时,asp-append-version 不工作

<link rel="Stylesheet" type="text/css" href="https://common.cnblogs.com/blog/css/aggsite-new.min.css" asp-append-version="true" />

请问如何解决这个问题?

dudu的主页 dudu | 高人七级 | 园豆:30902
提问于:2023-06-11 18:14
< >
分享
最佳答案
0

通过自己实现一个 CdnTagHelper 解决了

[HtmlTargetElement("link")]
[HtmlTargetElement(Attributes = UseCdnAttributeName)]
public class CdnTagHelper : TagHelper
{
    private const string UseCdnAttributeName = "asp-use-cdn";
    private const string DefaultCdnBaseUrl = "https://common.cnblogs.com";
    private readonly string _cdnBaseUrl;

    public CdnTagHelper(IConfiguration configuration)
    {
        _cdnBaseUrl = configuration.GetValue("cdn:baseUrl", DefaultCdnBaseUrl) ?? DefaultCdnBaseUrl;
    }

    [HtmlAttributeName(UseCdnAttributeName)]
    public bool? UseCdn { get; set; }

    public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        if (UseCdn == true && output.Attributes.TryGetAttribute("href", out var hrefAttr))
        {
            var href = hrefAttr.Value?.ToString();
            if (!string.IsNullOrEmpty(href) &&
                href.StartsWith("/") &&
                !href.StartsWith("//"))
            {
                output.Attributes.SetAttribute("href", _cdnBaseUrl + href);
            }
        }

        return base.ProcessAsync(context, output);
    }
}

Razor 视图中使用

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

输出结果

<link rel="stylesheet" href="https://common.cnblogs.com/css/site.css?v=pAGv4ietcJNk_EwsQZ5BN9-K4MuNYS2a9wl4Jw-q9D0" />

如果不想自己实现,可以使用这个 nuget 包 WebEssentials.AspNetCore.CdnTagHelpers

dudu | 高人七级 |园豆:30902 | 2023-06-17 12:33
其他回答(2)
0

在ASP.NET Core中,asp-append-version是一个用于在文件路径中添加文件版本号的标记,以便在文件内容发生更改时刷新缓存。然而,这个功能只在本地文件路径中起作用,而不适用于CDN引用。

如果您需要使用CDN引用,并希望实现类似的版本控制机制,可以考虑以下解决方案之一:

手动更新文件版本号:您可以手动更新CDN引用的文件链接,以包含新的版本号。每当您更改文件时,都需要更新链接中的版本号。这样可以确保浏览器获取到最新版本的文件,而不会使用旧的缓存文件。

使用查询字符串参数:在CDN引用的文件链接中添加一个查询字符串参数来表示文件的版本号。例如:

html
Copy code
<link rel="stylesheet" type="text/css" href="https://common.cnblogs.com/blog/css/aggsite-new.min.css?v=1.0" />
当文件内容发生更改时,您可以通过更新查询字符串参数的值来告诉浏览器获取最新版本的文件。例如,将v=1.0更改为v=1.1。

注意:如果您的CDN对查询字符串参数进行缓存,这种方法可能会导致缓存问题。您需要确保CDN正确处理查询字符串参数,以便在文件内容更改时提供新的文件版本。

使用文件内容的哈希值:为每个文件生成唯一的哈希值,并将其添加到CDN引用的文件链接中。例如:

html
Copy code
<link rel="stylesheet" type="text/css" href="https://common.cnblogs.com/blog/css/aggsite-new.min.css?v=12a6b4f8c">
您可以使用构建脚本或工具来自动生成文件的哈希值,并将其添加到文件链接中。当文件内容发生更改时,哈希值将改变,从而强制浏览器获取新的文件。

这些解决方案中的每一个都有其优缺点,具体取决于您的需求和实际情况。选择适合您项目的解决方案,并根据需要进行相应的实现。

收获园豆:15
Technologyforgood | 园豆:7541 (大侠五级) | 2023-06-11 21:31
0

https://source.dot.net/#Microsoft.AspNetCore.Mvc.Razor/Infrastructure/DefaultFileVersionProvider.cs,48
对于非本地的静态资源,似乎没办法,等一个骚操作

收获园豆:15
复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-06-12 15:40

是本地静态资源,CDN 回源到本地本地静态资源

支持(0) 反对(0) dudu | 园豆:30902 (高人七级) | 2023-06-12 22:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册