【问题标题】:Service/extension for getting a cache-busting 'version string'用于获取缓存破坏“版本字符串”的服务/扩展
【发布时间】:2017-11-21 10:51:39
【问题描述】:

背景

我有一个应用程序,其中 3 个视图利用 html5 离线应用程序功能。因此,我在剃刀视图中生成了一个应用程序清单。此视图的简化版本可能如下所示:

CACHE MANIFEST

CACHE:
/site.min.css
/site.min.js

为了使离线应用正常运行,缓存文件必须与应用内离线页面请求的文件完全匹配。但是,我想将“缓存清除”版本字符串应用于此清单中引用的 js/css 资源。对于 HTML 标记,ScriptTagHelper 支持此功能,但我没有找到任何支持纯 URL 的帮助程序/扩展方法(如上述清单中所要求的)。

参考this post,我通过将FileVersionProvider 注入我的清单视图并使用AddFileVersionToPath() 方法解决了这个问题,如下所示:

@inject FileVersionProvider versionProvider
CACHE MANIFEST

CACHE:
@versionProvider.AddFileVersionToPath("/site.min.css")
@versionProvider.AddFileVersionToPath("/site.min.js")

但是,FileVersionProvider 类位于 Microsoft.AspNetCore.Mvc.TagHelpers.Internal 命名空间中,从维护的角度来看,这并不能让我充满信心。

最后,我为此执行的 DI 设置并不完全理想(见下文)。我不喜欢我需要拨打GetService() 的事实,当然我应该指定一个特定的MemoryCache

services.AddSingleton<FileVersionProvider>(s => 
    new FileVersionProvider(
        s.GetService<IHostingEnvironment>()?.WebRootFileProvider, 
        s.GetService<IMemoryCache>(), 
        new PathString("") ));

问题

以前有没有人要求使用版本字符串创建指向 js/css 资源的链接?如果是这样,有没有更优雅的解决方案?

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.0 offline-caching


    【解决方案1】:

    你试过this extension method吗?它在 ASP.NET Core 2.1 LTS 上为我工作,没有任何依赖注入,只是扩展方法。如果您仍然使用它,它也应该在 2.0 中工作。

    我有一个类似的用例,其中 SCEditor 从 JavaScript 传递的路径加载 CSS。

    @{
        // Without version hash cache buster, the editor internally cache the request and we don't get the new stylesheet - even not with CTRL + F5
        string editorThemePath = this.AddFileVersionToPath("/css/my-editor-theme.css");
    }
    <script>
          sceditor.create(editorTextarea, {
                // ...
                style: '@editorThemePath'
          })
    </script>
    

    生成的 HTML

    <script>
          sceditor.create(editorTextarea, {
                style: '/css/my-editor-theme.css?v=sRU_qBg7xyQElPLskjekOlvSHdRF2Ap1leTP8ui4CaI',
          })
    </script>
    

    请记住,此实现需要相对于wwwroot 的路径。所以在这种情况下,/css/my-editor-theme.csswwwroot/css/my-editor-theme.css 中。

    如果将FileVersionProvider 的第一个参数从hostingEnvironment.WebRootFileProvider 替换为hostingEnvironment.ContentRootFileProvider,则可以更改。但是我还没有测试过它的副作用和安全问题,所以如果可能的话,你应该留在wwwroot,因为这个文件夹被设计成可以公开访问。

    【讨论】:

    • 谢谢@Lion。我第一次尝试时是 2.2 之前的版本,很高兴看到有更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多