#angular #azure #dns #asp.net-core-webapi #azure-web-app-service
#angular #azure #dns #asp.net-core-webapi #azure-web-app-service
Вопрос:
Я создал Angular SPA с Web API (.net core 3.1), используя шаблон Visual Studio, он был развернут в службе приложений Azure. SPA отлично работает с вызовом конечных точек API.
Однако, когда я пытаюсь вызвать API, например, из мобильного клиента, api/v1/users/123
где идентификатор пользователя 123 не существует, я ожидал бы 404, но вместо этого кажется, что преобладает маршрутизация Angular, поскольку вместо этого она возвращает домашнюю страницу SPA.
Могу ли я выполнить какую-либо конфигурацию, которая разрешит эту проблему, или я делаю это неправильно?
Кроме того, я добавил два поддомена к службе приложений, один для SPA и один для API: portal.NN.com и api.NN.com . Можно ли отключить SPA, когда api.NN.com используется?
Редактировать для пояснения: WebAPI используется как SPA, так и мобильным приложением Xamarin. Проблема в моем приложении Xamarin заключается в том, что я не получаю 404, когда пытаюсь найти ресурс, который не существует, или, если маршрут не существует, он перенаправляется на домашнюю страницу SPA (можно увидеть HTML при десериализации JSON).
Правка #2 — Настройка из Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware<ErrorHandlingMiddleware>();
app.UseCors("CorsPolicy");
if (!env.IsDevelopment())
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
if (!env.IsDevelopment())
{
app.UseSpaStaticFiles();
}
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
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.UseProxyToSpaDevelopmentServer("http://localhost:4200");
}
});
}
Комментарии:
1. Может быть, у вас есть запасной вариант в вашей таблице маршрутизации angular, например
{ path: '**', redirectTo: "starComponent" }
? Если у вас есть глобальный обработчик ошибок, для обработки примерно 404 результатов — попробуйте отображать время в виде панели закусок для мобильных устройств? Как работает эмулятор мобильной разработки по сравнению с телефонами? Это другой браузер на вашем телефоне?2. Вам следует опубликовать еще один вопрос, посвященный вашему второму вопросу — так вы с большей вероятностью получите лучшие ответы. Что касается вашего первого вопроса, вы хотите настроить свой модуль маршрутизации для перенаправления на страницу «404», которая будет перехватывать все ссылки в вашем приложении, которые не маршрутизируются.
3. Добавлено некоторое уточнение. Спасибо за совет, @MikeS.
4. Можете ли вы опубликовать общедоступный метод настройки void (приложение IApplicationBuilder, среда IWebHostEnvironment env) из StartUp.cs?
Ответ №1:
Попробуйте использовать приложение.Используйте эту функцию.
Документация: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1#branch-the-middleware-pipeline
app.UseWhen(x=> !x.Request.Path.Value.Contains("ApiEndPoint"), app1 =>
app1.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
})
);
Надеюсь, это поможет.