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