我想使用Asp.Net Core 2.2来托管我的Angular应用程序 - 以及提供API请求(在/ api上)。
所以在Startup.cs,Configure中,我设置了以下内容:
app.Map("/home", config =>
{
config.UseSpa(spa =>
{
...
});
});
但是,问题是找不到runtime.js,polyfills.js等因为它们被引用为http://localhost:port/filename.ext
我试着用
config.UseSpaStaticFiles(new StaticFileOptions { RequestPath = "/runtime.js" });
但无济于事。
在ASP.Net Core中以不同路线服务Angular SPA的秘诀是什么?
编辑:回答@Michael - 我正在调查这个以最终托管多个应用程序,但我认为它可能不值得这么麻烦。我希望能够在开发应用程序时进行“服务”,并在部署时在Asp.Net Core下运行。如果一件事有效,另一件事就是破碎。因此决定暂时提出来。
我将讨论csproj配置,package.json npm配置,以及自然的Startup.cs代码。
在csproj文件的底部,您将找到一组在发布应用程序时运行的npm命令。
<!--...-->
<PropertyGroup>
<SpaRoot>ClientApp\</SpaRoot>
</PropertyGroup>
<!--...-->
<Exec WorkingDirectory="$(SpaRoot)" Command="npm install" />
<Exec WorkingDirectory="$(SpaRoot)" Command="npm run build -- --prod" />
<Exec WorkingDirectory="$(SpaRoot)" Command="npm run build:ssr -- --prod" Condition=" '$(BuildServerSideRenderer)' == 'true' " />
<!--...-->
如果您希望部署两个应用程序,则需要将所有这些部署指令加倍。
<!--...-->
<PropertyGroup>
<!--...-->
<SpaRoot>ClientApp\</SpaRoot>
<SpaRoot2>ClientApp2\</SpaRoot2>
<!--...-->
</PropertyGroup>
<!--...-->
<Exec WorkingDirectory="$(SpaRoot)" Command="npm install" />
<!--...-->
<Exec WorkingDirectory="$(SpaRoot2)" Command="npm install" />
<!--...-->
在开发过程中,您可能希望nodejs托管应用程序。在这种情况下,我们的服务器不托管我们的客户端应用程序
您将需要设置servepath以匹配您希望客户端应用程序用完的子目录。
// ...
"start": "ng serve --servePath /app/ --baseHref /app/",
// ...
此时,不要忘记更新构建的baseHref。否则,当csproj中的脚本调用build时,它将不会指向正确的basehref。
"build": "ng build --baseHref /app/",
还记得我在开发过程中如何说服务器不托管客户端吗?我建议在开发过程中一次运行一个。重要的是你更新了package.json servePath,以便测试url路径以及所有内容如何链接在一起。
if (env.IsDevelopment())
{
app.UseSpaStaticFiles();
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
// this is calling the start found in package.json
spa.UseAngularCliServer(npmScript: "start");
});
}
else // Production -- in the next section,
最后,我们有我们希望它在生产中表现的方式。
// how you had it, we will create a map
// for each angular client we want to host.
app.Map(new PathString("/app"), client =>
{
// Each map gets its own physical path
// for it to map the static files to.
StaticFileOptions clientAppDist = new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(
Directory.GetCurrentDirectory(),
@"ClientApp\dist"
)
)
};
// Each map its own static files otherwise
// it will only ever serve index.html no matter the filename
client.UseSpaStaticFiles(clientAppDist);
// Each map will call its own UseSpa where
// we give its own sourcepath
client.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
spa.Options.DefaultPageStaticFileOptions = clientAppDist;
});
});
您可以通过在运行C#代码之前注释掉开发代码并在各自的clientapp文件夹中运行npm run build来测试生产设置。只需确保生成的dist文件夹未检入您的git仓库。
希望您现在能更好地了解它在开发环境中的工作原理,创建构建指令以及它如何在生产环境中运行。