Я хочу использовать Asp.Net Core 2.2 для размещения моего приложения Angular, а также для обслуживания запросов API (на /api).
Итак, в Startup.cs, Configure я установил следующее:
app.Map("/home", config =>
{
config.UseSpa(spa =>
{
...
});
});
Однако проблема в том, что runtime.js, polyfills.js и т. д. не найдены, потому что на них ссылаются как на http://localhost:порт/имя_файла.ext.
я пытался использовать
config.UseSpaStaticFiles(new StaticFileOptions { RequestPath = "/runtime.js" });
Но безрезультатно.
В чем секрет обслуживания Angular SPA по другому маршруту в ASP.Net Core?
Редактировать: Отвечая @Michael - я изучал это, чтобы в конечном итоге разместить несколько приложений, но я подумал, что это может не стоить проблем. Я хочу иметь возможность выполнять «ng serve» при разработке приложений и работать под управлением Asp.Net Core при развертывании. Если одно работает, другое ломается. Вот и решил пока поставить на стол.
@kotpal Ты когда-нибудь это понимал?





Я собираюсь поговорить о конфигурациях 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 размещал приложение. В этом случае наш сервер не размещает наше клиентское приложение.
Вам нужно будет установить serverpath в соответствии с подкаталогом, из которого вы хотите запустить клиентское приложение.
// ...
"start": "ng serve --servePath /app/ --baseHref /app/",
// ...
На этом этапе не забудьте обновить baseHref для сборки. в противном случае, когда скрипты в csproj вызывают build, они не будут указывать на правильный basehref.
"build": "ng build --baseHref /app/",
Помните, как я сказал во время разработки, что сервер не содержит клиента? Я бы предложил запускать по одному во время разработки. Важно то, что вы обновляете serverPath package.json, чтобы проверить путь 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;
});
});
вы можете протестировать производственную установку, закомментировав код разработки и запустив npm запустить сборку в соответствующих папках clientapp перед запуском кода C#. Просто убедитесь, что сгенерированная папка dist не зарегистрирована в вашем репозитории git.
Надеюсь, теперь вы лучше понимаете, как это работает в среде разработки, как создавать инструкции по сборке и как это будет работать в производственной среде.
Я не уверен, как выглядит ваш базовый путь. Но вроде бы вопрос о том, как обслуживать статику, и вполне похоже на этот вопрос. Надеюсь, поможет.