Несмотря на то, что это делается путем перенаправления запросов на Angular Development Server
, прокси-сервер проксируется не IIS, а самим ядром ASP.NET. IIS не знает, какой порт прослушивает Angular Dev Server. .
UseAngularCliServer("start")
сначала вызовет команду
npm start -- --port {dynamic_port}
{dynamic_port}
здесь вычисляется в RunTime
. Поскольку команда npm
уже настроена в package.json
, она затем запустит сервер разработки с помощью ng serve -- --port {dynamic_port}
.
Если
ng serve
работает безупречно, он создаст простой
HttpClient
для прокси и использует его для выполнения прокси (перенаправляет запросы на
Angular Dev Server
с простым
HttpClient
и копирует ответ как собственный ответ),Прокси
WebSocket
будет работать аналогичным образом.
Исходный код вы можете найти на GitHub .Его легко читать и понимать.
Внутренне UseAngularCliServer(npmScript: "start")
вызовет AngularCliMiddleware
для выполнения step 1
и step 2
.Шаг 1 выполняется следующим образом:
var angularCliServerInfoTask = StartAngularCliServerAsync(sourcePath, npmScriptName, logger);
Метод StartAngularCliServerAsync
найдет доступный порт TCP и запустит команду npm start -- --port {port}
для запуска ng serve
:
private static async Task<AngularCliServerInfo> StartAngularCliServerAsync(
string sourcePath, string npmScriptName, ILogger logger)
{
var portNumber = TcpPortFinder.FindAvailablePort();
logger.LogInformation($"Starting @angular/cli on port {portNumber}...");
var npmScriptRunner = new NpmScriptRunner( sourcePath, npmScriptName, $"--port {portNumber}", null);
// ...
}
См. Полный код здесь
И шаг 2 выполняется:
public static void UseProxyToSpaDevelopmentServer(this ISpaBuilder spaBuilder, Func<Task<Uri>> baseUriTaskFactory)
{
// ...
// Proxy all requests to the SPA development server
applicationBuilder.Use(async (context, next) =>
{
var didProxyRequest = await SpaProxy.PerformProxyRequest( context, neverTimeOutHttpClient, baseUriTaskFactory(), applicationStoppingToken, proxy404s: true);
});
}
Реализация PerfromProxyRequest()
может быть найдена здесь .Для обычных запросов он просто перенаправляет их с помощью простого HttpClient
и копирует ответ в качестве своего собственного ответа.
Вернуться к вашему вопросу:
Где находится папка dist?
Поскольку вы настроили spa.UseAngularCliServer("start")
:
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
Все эти запросы будут обрабатываться локальным сервером dev, запущенным angular cli.В результате на диске вообще нет dist
.То же самое произойдет, если вы выполните команду ng serve
вручную.
Как «ng serve» относится к IIS Express?
IIS не имеет представления опорт прослушивается Angular Dev Server.При поступлении входящего сообщения IIS просто отправляет его на сервер ASP.NET Core.Если запрос не может быть обработан staticFiles, MVC или любым другим промежуточным программным обеспечением, которое вы настроили до UseSpa()
, ASP.NET Core перенаправит его на сервер Dev.