Как промежуточное ПО spa.UseAngularCliServer () обслуживает веб-страницу? - PullRequest
0 голосов
/ 12 октября 2018

Я создаю приложение .Net Core 2.1 Angular с Visual Studio 2017 (версия 15.7.2) enter image description here

Интересно, как spa.UseAngularCliServer () обслуживает страницу врежим разработки.

  1. В режиме отладки в папке ClientApp или wwwroot нет папки dist, хотя веб-страница загружается нормально.Где находится папка dist?

  2. Похоже, что промежуточное программное обеспечение spa запускает сервер angular-cli dev, но веб-страница на самом деле размещается в IIS Express.Как «ng serve» относится к IIS Express?

Форма starup.cs

app.UseSpa(spa =>
            {
                // To learn more about options for serving an Angular SPA from ASP.NET Core,
                // see https://go.microsoft.com/fwlink/?linkid=864501

                spa.Options.SourcePath = "ClientApp";

                if (env.IsDevelopment())
                {
                    spa.UseAngularCliServer(npmScript: "start");
                }
            });

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Несмотря на то, что это делается путем перенаправления запросов на Angular Development Server, прокси-сервер проксируется не IIS, а самим ядром ASP.NET. IIS не знает, какой порт прослушивает Angular Dev Server. .

  1. 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.

0 голосов
/ 12 октября 2018
  1. Нет необходимости в папке dist, поскольку файлы создаются и хранятся в памяти сервером webpack, который используется внутри Angular CLI.

  2. Запросы для SPA реверсируются IIS на Angular Dev Server.Таким образом, IIS получает запрос от браузера -> IIS отправляет запрос на угловой сервер dev -> dev сервер отправляет данные обратно в IIS -> IIS отправляет данные в браузер.

...