UseProxyToSpaDevelopmentServer скрывает маршруты веб-API ASP.NET.C#

Место общения программистов C#
Ответить
Anonymous
 UseProxyToSpaDevelopmentServer скрывает маршруты веб-API ASP.NET.

Сообщение Anonymous »

У меня есть новый веб-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:

Код: Выделить всё

/ProjectName
│
├── /Controllers
│   ├── WeatherForecastController.cs
│
├── /wwwroot
│   ├── /webclient
│   │   ├── /src
│   │   └── ...
│   ├── index.html
│   └── ... (other .js & .css for Angular)
│
├── appsettings.json
├── Program.cs
└── ...
Вот содержимое Program.cs:

Код: Выделить всё

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 возвращается (показан ниже за пределами список уценок)

    Код: Выделить всё

    
    
    
    Error
    
    
    Cannot GET /WeatherForecast
    
    
    
    Возможно, стоит отметить, что интегрированное одностраничное приложение 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 кажется мне огромным, и я не могу поверить, что это не работает, просто я я делаю это неправильно.

    Подробнее здесь: https://stackoverflow.com/questions/792 ... api-routes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»