我有两个asp.net核心应用程序,它们共享许多静态资产(图像,css,字体等),作为临时解决方案,我在两个项目中保留副本。我想简化这一点,显然只保留一份资产,并使两个项目都可以访问。
我正在考虑解决方案,并想知道是否有可能在解决方案中创建一个新项目,并以某种方式将内容复制到Azure CDN,例如git commit,然后只引用源中的CDN URL。显然,我不想手动管理这些内容,每次更改CSS或添加图像时都必须手动将文件上传到CDN / Storage端点。
但是,我看不出这是否可能,如果可以,如何设置? 应用程序本身托管在Azure中,因此需要将其实现为可视工作室修复程序(例如旧的“添加链接”似乎不再可用?)或Azure中。
欢迎任何有关如何实现这一目标的建议。
由于
答案 0 :(得分: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
中。现在,我使用/src/assets
将wwwroot/assets
映射到Foo.Web1
和Foo.Web2
项目中的PhysicalFileProvider
文件夹中。在Startup.cs
的{{1}}方法中,添加以下内容:
Configure
现在,来自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.Web1
的所有请求。 Foo.Web2
中的所有更改将实时反映。这项工作在开发人员中很棒,但是在生产中,我不这样做。相反,我在部署脚本中将文件从/src/assets
复制到/src/assets
和Foo.Web1/wwwroot/assets
,所以不需要重新映射。
答案 1 :(得分:0)
最简单的方法是将静态内容发布到存储帐户(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是多么容易,以及它能提高你网站的快感感。
[编辑] - 忘记了AzureFileCopy vsts任务,请参阅GitHub project
答案 2 :(得分:0)
Russell Young提出的解决方案肯定会有效,但也许更简单的方法是在CDN中使用自定义源并将原始URL指向静态资产的原始位置。这样就无需管理2个地点的资产。
答案 3 :(得分:0)
看看WebEssentials.AspNetCore.CdnTagHelpers。这是一个通过CDN轻松提供.net核心静态资源的核心。似乎它将解决您的问题