ASP.Net核心:使用共享项目在许多项目之间共享静态资产(css / js)

时间:2018-06-01 21:23:51

标签: visual-studio asp.net-core

从这里获取灵感:http://rion.io/2017/03/22/sharing-is-caring-using-shared-projects-in-asp-net/,我正在尝试使用共享项目在多个ASP.Net Core项目之间共享静态资产(例如css / js)。

我创建了一个共享项目,并将此文件添加到此文件夹层次结构中:

enter image description here

然后,我从ASP.Net Core Web项目中添加了对此共享项目的引用。但是,当我运行项目时,我无法访问此文件。我尝试了这些网址(以及其他许多网址):

http://localhost:50000/assets.style.css
http://localhost:50000/wwwroot/assets/style.css

它们都导致404.似乎我要么找不到在我的web项目中使这些文件可用的方法,要么我错误地引用它们。任何人都知道如何使这项工作?

2 个答案:

答案 0 :(得分:3)

这是我解决此问题的方法。我没有使用共享项目,因为我无法使用它。取而代之的是,我使用了PhysicalFileProvider,它的工作原理就像是魅力。

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

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

我将所有共享的静态资产(例如css,JavaScript,图像)放在/src/assets中。现在,我使用/src/assetswwwroot/assets映射到Foo.Web1Foo.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/assetsFoo.Web1/wwwroot/assets,所以不需要重新映射。

答案 1 :(得分:1)

我知道这个问题已有两年了,但是我需要在支持两种托管模型(服务器和WebAssembly)的blazor应用程序中共享静态资产,并找到了另一个解决方案。

以防万一,共享项目是Razor类库。

enter image description here

wwwroot在Ux.Shared项目上,Ux.Server(Blazor服务器托管模型)和Ux.Wasm(Blazor WebAssembly托管模型)都引用了该项目。 要在两个项目中都使用此资产,只需使用:

_content/{LIBRARY NAME}/

然后例如在您引用该资产的每个项目的index.html中,如下所示:

 <link href="_content/Ux.Shared/css/bootstrap/bootstrap.min.css" rel="stylesheet" />

这在Blazor中很好用,我想它也可以在Asp .Net Core中工作。