У меня есть новый веб-API ASP.NET Core (.NET 8.0), и я планирую разместить одностраничное приложение Angular (^18.0.0) (SPA) в папке wwwroot. Во время разработки я хочу запускать/отлаживать SPA локально в Node.js, используя ngserve, а во время производства я хочу обслуживать index.html и main.js с уникальным именем. code>, Polyfills.js и Styles.css из wwwroot, которые я создал, запустив ng build --configuration Production.
В производственном сценарии это работает нормально, но в разработки, это как если бы ASP.NET поглощал или блокировал запросы к маршрутам API.
Вот базовая структура проекта с WeatherForecastController:
namespace IntegratedSpaWebApi;
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.UseSpa(config =>
{
config.Options.SourcePath = "webclient";
if (app.Environment.IsDevelopment())
{
// This next line is the feature that causes the problem for me...
config.UseProxyToSpaDevelopmentServer("http://localhost:4200/");
}
});
app.Run();
}
}
При создании проекта я сделал еще несколько важных вещей:
Перед созданием установил флажок «Включить поддержку OpenAPI». это в Microsoft Visual Studio 2022 Enterprise.
Добавлен пакет NuGet Microsoft.AspNetCore.SpaServices.Extensions (Version="8.0.1")
Пакет NuGet позволяет вызывать метод расширения app.UseSpa(...), а SwaggerGen помогает продемонстрировать, что что-то пошло не так.
Чтобы воспроизвести проблему, я могу запустить проект .NET и перейти к https://localhost:7087/swagger/index.html, где у меня есть возможность «Опробовать» метод GET/WeatherForecast. (без параметров).
Что происходит дальше, зависит от среды:
Производство
Ответ 200 JSON возвращается, как ожидалось
Разработка (при условии, что ng служит также запущен)
Ответ 404 HTML возвращается (показан ниже за пределами список уценок)
Возможно, стоит отметить, что интегрированное одностраничное приложение Angular работает корректно как в производственном, так и в случае разработки, если я запрашиваю index.html.
Также стоит отметить, что когда я не могу получить доступ к веб-API из SwaggerGen (разработка), то использую простой GET для https://localhost:7087/WeatherForecast в браузере. также возвращает то же самое 404 HTML. Но когда я могу получить доступ к веб-API из SwaggerGen (производственная версия), тот же URL-адрес также возвращает 200 JSON. Очень последовательно.
Похоже, что вызов UseProxyToSpaDevelopmentServer меня сбивает с толку. Я пробовал это как выше, так и ниже вызова MapControllers без каких-либо изменений в поведении, но мне интересно, имеет ли время обратного вызова конфигурации UseSpa какое-то отношение к этому. Кажется странным, что SwaggerGen правильно маршрутизирует swagger/index.html, но вызов WeatherForecastController (чей маршрут я пытался указать как [Route("[controller]")] и [Route( "api/weather")] (но не одновременно, конечно)) неправильно маршрутизирует запрос.
Есть идеи, что я делаю не так?
Удобство возможности отлаживать Angular одновременно с отладкой ASP.NET и делать это без каких-либо проблем с CORS кажется мне огромным, и я не могу поверить, что это не работает, просто я я делаю это неправильно.
У меня есть новый веб-API ASP.NET Core (.NET 8.0), и я планирую разместить одностраничное приложение Angular (^18.0.0) (SPA) в папке wwwroot. Во время разработки я хочу запускать/отлаживать SPA локально в Node.js, используя ngserve, а во время производства я хочу обслуживать index.html и main.js с уникальным именем. code>, Polyfills.js и Styles.css из wwwroot, которые я создал, запустив ng build --configuration Production. В производственном сценарии это работает нормально, но в разработки, это как если бы ASP.NET поглощал или блокировал запросы к маршрутам API. Вот базовая структура проекта с WeatherForecastController: [code]/ProjectName │ ├── /Controllers │ ├── WeatherForecastController.cs │ ├── /wwwroot │ ├── /webclient │ │ ├── /src │ │ └── ... │ ├── index.html │ └── ... (other .js & .css for Angular) │ ├── appsettings.json ├── Program.cs └── ... [/code] Вот содержимое Program.cs: [code]namespace IntegratedSpaWebApi;
public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args);
// Add services to the container. builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); }
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.UseSpa(config => { config.Options.SourcePath = "webclient"; if (app.Environment.IsDevelopment()) { // This next line is the feature that causes the problem for me... config.UseProxyToSpaDevelopmentServer("http://localhost:4200/"); } });
app.Run(); } } [/code] При создании проекта я сделал еще несколько важных вещей: [list] [*]Перед созданием установил флажок «Включить поддержку OpenAPI». это в Microsoft Visual Studio 2022 Enterprise. [*]Добавлен пакет NuGet Microsoft.AspNetCore.SpaServices.Extensions (Version="8.0.1") Пакет NuGet позволяет вызывать метод расширения app.UseSpa(...), а SwaggerGen помогает продемонстрировать, что что-то пошло не так. Чтобы воспроизвести проблему, я могу запустить проект .NET и перейти к https://localhost:7087/swagger/index.html, где у меня есть возможность «Опробовать» метод GET/WeatherForecast. (без параметров). Что происходит дальше, зависит от среды: [list] [*]Производство
Ответ 200 JSON возвращается, как ожидалось [/list]
[*]Разработка (при условии, что ng служит также запущен) [list] Ответ 404 HTML возвращается (показан ниже за пределами список уценок) [/list]
[code]
Error
Cannot GET /WeatherForecast
[/code] Возможно, стоит отметить, что интегрированное одностраничное приложение Angular работает корректно как в производственном, так и в случае разработки, если я запрашиваю index.html. Также стоит отметить, что когда я не могу получить доступ к веб-API из SwaggerGen (разработка), то использую простой GET для https://localhost:7087/WeatherForecast в браузере. также возвращает то же самое 404 HTML. Но когда я могу получить доступ к веб-API из SwaggerGen (производственная версия), тот же URL-адрес также возвращает 200 JSON. Очень последовательно. Похоже, что вызов UseProxyToSpaDevelopmentServer меня сбивает с толку. Я пробовал это как выше, так и ниже вызова MapControllers без каких-либо изменений в поведении, но мне интересно, имеет ли время обратного вызова конфигурации UseSpa какое-то отношение к этому. Кажется странным, что SwaggerGen правильно маршрутизирует swagger/index.html, но вызов WeatherForecastController (чей маршрут я пытался указать как [Route("[controller]")] и [Route( "api/weather")] (но не одновременно, конечно)) неправильно маршрутизирует запрос. Есть идеи, что я делаю не так? Удобство возможности отлаживать Angular одновременно с отладкой ASP.NET и делать это без каких-либо проблем с CORS кажется мне огромным, и я не могу поверить, что это не работает, просто я я делаю это неправильно.