【问题标题】:Sharing static assets between asp.net core applications (or via Azure CDN?)在 asp.net 核心应用程序之间共享静态资产(或通过 Azure CDN?)
【发布时间】:2016-11-22 07:35:02
【问题描述】:

我有两个 asp.net 核心应用程序,它们共享一些静态资产(图像、css、字体等),作为临时解决方案,我在两个项目中都保留了副本。我想简化这一点,显然只保留一份资产副本,并使其可供两个项目访问。

我正在考虑解决方案,并想知道是否可以在解决方案中创建一个新项目并以某种方式将内容复制到 Azure CDN,例如在 git commit 时,然后只需在源中引用 CDN URL。显然,我不想手动管理此内容,并且每次更改 CSS 或添加图像时都必须手动将文件上传到 CDN/Storage 端点。

但是,我看不出这是否可行,如果可以,如何设置? 该应用程序本身托管在 Azure 中,因此需要将其作为 Visual Studio 修复程序(例如,旧的“添加链接”似乎不再可用?)或在 Azure 中实现。

欢迎就如何实现这一目标提出任何建议。

谢谢

【问题讨论】:

    标签: azure asp.net-core azure-cdn


    【解决方案1】:

    我使用PhysicalFileProvider 在多个 ASP.NET 核心 Web 项目之间共享静态资产,并且效果非常好。我也在此处发布了相同的答案:https://stackoverflow.com/a/52048104/188740,因为它也适用于那里。

    为此,我在src 中创建了一个新文件夹。我称它为assets,所以我的解决方案资源管理器看起来像这样:

    src/assets
    src/Foo.Web1
    src/Foo.Web2
    test/Foo.Tests
    

    我将所有共享的静态资产(例如 css、JavaScript、图像)放在 /src/assets 中。现在我使用PhysicalFileProvider/src/assets 映射到Foo.Web1Foo.Web2 项目中的wwwroot/assets 文件夹。在Startup.csConfigure方法中,我添加了这个:

    if (Env.IsDevelopment())
    {
        // app is IApplicationBuilder and Env is IHostingEnvironment
        app.UseStaticFiles(new StaticFileOptions
        {
            FileProvider = new PhysicalFileProvider(Regex.Replace(Env.ContentRootPath, $"{Env.ApplicationName}$", "assets"))),
            RequestPath = new PathString("/assets"),
            OnPrepareResponse = ctx =>
            {
                // Optionally manipulate the response as you'd like. for example, I'm setting a no cache directive here for dev.
                ctx.Context.Response.Headers.Append("Cache-Control", "no-cache, no-store, must-revalidate");
            }
        });
    }
    

    现在,来自/assets 的任何请求都将从/src/assets 文件夹提供,该文件夹可由Foo.Web1Foo.Web2 共享。 /src/assets 中的所有更改都将实时反映。这在开发中工作得很好,但在生产方面,我不这样做。相反,我在我的部署脚本中将文件从 /src/assets 复制到 Foo.Web1/wwwroot/assetsFoo.Web2/wwwroot/assets,因此不需要重新映射。

    【讨论】:

      【解决方案2】:

      看看WebEssentials.AspNetCore.CdnTagHelpers。这是一个 nuget,它可以轻松地通过 CDN 提供 .net 核心静态资源。看来它会解决你的问题

      【讨论】:

        【解决方案3】:

        最简单的方法是将静态内容发布到存储帐户(blob),然后将 CDN 连接到存储帐户;然后,您可以更改项目中的任何 url 引用以使用 CDN 端点,而不仅仅是正常的相对路由。

        您想要自动化的部分是在构建/发布时 - 您可以使用 VSTS 添加命令任务以使用 AZCOPY 将所有静态文件放在存储帐户中的正确位置;如果您不使用 CI/CD 流程进行开发/测试,您也可以在构建后任务中执行此操作。

        如果您需要清除 CDN,您可以通过 REST API 调用来完成,例如

        POST /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Cdn/profiles/{profileName}/endpoints/{endpointName}/purge?api-version=2016-10-02
        

        CDN docs here

        这是一条不错的下坡路,但没有多少人意识到 Azure 中的 CDN 有多么简单,以及它在多大程度上改善了您网站的活泼感。

        [编辑] - 忘记了 AzureFileCopy vsts 任务,请参阅GitHub project

        【讨论】:

          【解决方案4】:

          Russell Young 提出的解决方案肯定会奏效,但也许更简单的方法是在 CDN 中使用自定义源,并将源 URL 指向静态资产的原始位置。这样就无需管理 2 个位置的资产。

          【讨论】:

            猜你喜欢
            • 2018-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-26
            相关资源
            最近更新 更多