塞纳里奥
我想构建一个包含小型SPA前端的 aspnetcore 库/module。即 html/js/css 文件应该与 dll 一起出现。该SPA应该从一个特定的路径送达,即/some-module
(并没有需要进行配置)。SPA 由几个 html/js/css 文件组成,让我们假设以下文件:
/my-module/index.html
/my-module/index.js
/my-module/index.css
这些 url 应该只是服务器文件。所有其他路径,例如
/my-module/
/my-module/page-1
/my-module/page-2
应该为 index.html 提供服务,以便客户端路由可以处理请求。
我有一个部分解决方案,其中提供 SPA 文件。但是我不知道如何使所有其他子路径即/my-module/*
(不包括文件)返回index.html
.
使用嵌入文件和 UseFileServer 的部分解决方案:
假设 SPA 构建文件位于/my-library/web/build/
. 以下 csproj 使用GenerateEmbeddedFilesManifest
和将这些文件嵌入到 dll 中EmbeddedResource
:
my-module.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
<SpaRoot>web\</SpaRoot>
<DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
</PropertyGroup>
<ItemGroup>
<Folder Include="web\" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="web\build\**" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" />
</ItemGroup>
</Project>
以下中间件配置使用以下内容提供这些嵌入文件ManifestEmbeddedFileProvider
:
public static void UseMyModuleUi(this IApplicationBuilder app)
{
app.UseFileServer(new FileServerOptions
{
RequestPath = "/my-module",
FileProvider = new ManifestEmbeddedFileProvider(
assembly: Assembly.GetAssembly(typeof(ServiceExtensions)), "web/build")
});
}
UseMyModuleUi
在引用我的module的某些 aspnetcore 应用程序中调用扩展方法,这确实为下面的文件提供服务
/my-module/index.html
/my-module/index.js
/my-module/index.css
甚至/my-module/
服务my-module/index.html
。
但是,/my-module/
例如下的所有其他路径my-module/page-1
不提供服务index.html
。#
我试过的替代方案
我尝试使用UseSpaStaticFiles
orUseStaticFiles
和 的一些组合Map
,但是没有很好的结果。
我正在构建的项目可在此处获得:https : //github.com/jannikbuschke/ef-configuration-provider
该ui
项目是嵌入 SPA 的库。该sample
项目是宿主应用程序。