Запросы веб-API перенаправляются на index.html

#reactjs #.net #asp.net-core #asp.net-web-api #react-router

Вопрос:

Я использую шаблон проекта .NET 5.0 React. Когда приложение развертывается в моей среде разработки, некоторые запросы к контроллерам API перенаправляются на index.html. Это не происходит, когда он работает локально.

Однако большинство маршрутов продолжают работать при развертывании, и я не вижу разницы в том, как настроены контроллеры ApiControllers, стоящие за ними, по сравнению с маршрутами, которые перенаправляются на index.html.

Вот контроллер, маршруты которого перенаправляются на index.html:

 namespace DonationMembership.Api.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class RedirectController : ControllerBase
    {
        private readonly IConfigurationRoot configuration;

        public RedirectController(IConfiguration configuration)
        {
            this.configuration = (IConfigurationRoot)configuration;
        }

        [HttpGet]
        public ActionResult OlcUrl()
        {
            var olcUrl = configuration[Constants.Settings.OlcSite];
            return Ok(olcUrl);
        }
    }
}
 

И вот один, чьи маршруты продолжают работать при развертывании:

 namespace DonationMembership.Api.Controllers
{
  [ApiController]
    [Route("[controller]")]
    public class DonationLevelController : ControllerBase
    {
        private readonly ILogger<DonationLevelController> _logger;
        private readonly IDonationLevelService donationLevelService;
        private readonly IConfigurationRoot configuration;

        public DonationLevelController(ILogger<DonationLevelController> logger, 
            IDonationLevelService donationLevelService, 
            IConfiguration configuration)
        {
            _logger = logger;
            this.donationLevelService = donationLevelService;
            this.configuration = (IConfigurationRoot)configuration;
        }


        [HttpGet]
        public ActionResult<ODataResult<DonationLevelContract>> Get()
        {
            return Ok(donationLevelService.GetDonationLevels());
        }
  }
}
 

Любое понимание будет оценено по достоинству, спасибо! И да, я использую префикс ‘/api’ при отправке запросов на мой маршрут перенаправления 🙂

Редактировать:

Мой стартап.cs:

 // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    ConfigureDeps(services);

    ConfigureSwagger(services);

    ConfigureJwt(services);

    services.AddControllers().AddNewtonsoftJson();

    services.AddSpaStaticFiles(configuration =>
    {
        configuration.RootPath = Constants.Settings.ClientPath;
    });
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseSwagger();
        app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyApp v1"));
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseSpaStaticFiles();
    app.UseRouting();
    app.UseCertificateForwarding();

    // UseAuthentication() must come before UseAuthorization() for JWT config to work
    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });

    app.UseSpa(spa =>
    {
        spa.Options.SourcePath = "ClientApp";

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

Я не включил содержимое моих трех помощников по настройке* (). Они не делают ничего, связанного с конфигурациями контроллера или маршрутов.

Комментарии:

1. Промежуточное программное обеспечение приложения react обрабатывает необработанные запросы и перенаправляет их на index.html. Я бы проверил, правильно ли настроен маршрут контроллера, и, возможно, опубликовал метод настройки в вашем файле startup.cs, который поможет определить проблему.

2. @weichch Я обновил, чтобы включить свой Startup.cs, спасибо за отзыв.

3. Я решил эту проблему, разделив клиента и API на отдельные проекты. Без библиотек DLL SPA в папке развертывания API все запросы выполнялись без перенаправления. Я оставляю этот вопрос открытым, так как я его не решил, я все равно очень хотел бы знать, как сохранить API и клиент вместе, не влияя перенаправлением на мои вызовы API.