Angular с MVC Core, отлавливающим некоторые маршруты, которые должны идти к контроллерам - PullRequest
0 голосов
/ 02 октября 2019

Так что я не уверен, почему, но некоторые моих маршрутов попадают в мой контроллер, но некоторые ловятся и возвращают угловой материал. Я покажу, что я считаю важным, и, возможно, кто-то может показать, что мне не хватает:

startup.cs:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "api",
        template: "api/{controller}/{action}/{id?}");
});

app.UseSpa(spa =>
{
    spa.Options.SourcePath = "ClientApp";
    if (env.IsDevelopment())
    {
        spa.UseAngularCliServer(npmScript: "start");
    }
});

ThingController.cs:

[ApiController]
[Route("api/thing")]
public class ThingController : ControllerBase
{
    [HttpGet]
    [Route("get/{id:int}")]
    public static Thing Get(int id)
    {
        return new Thing(id);
    }

    [HttpGet]
    [Route("get-all")]
    public async Task<IEnumerable<Thing>> GetAll()
    {
        return new List<Thing>();
    }
}

app-routing.module.ts:

const routes: Routes = [
  {
    path: 'things',
    component: ThingsComponent
  },
  {
    path: 'thing/:id',
    component: ThingComponent
  },
  {
    path: '**',
    redirectTo: '/things'
  }
];

Итак, из моего приложения я вызываю localhost/api/thing/get-all, и он просто попадает в контроллер, но если я вызываю localhost/api/thing/get/2, меня обслуживают на странице Angular. Чего мне не хватает, что один делает это, а другой нет? Спасибо.

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Другое изменение, которое я могу предложить, - настроить Route Attribute на вашем public static Thing Get(int id) действии.

Попробуйте:

[HttpGet, Route("GetThing")] //localhost/api/thing/GetThing/2
public static Thing Get(int id)
{
    return new Thing(id);
}

НЕ включайте параметр ({id:int}) в атрибут маршрута.

1 голос
/ 02 октября 2019

Если вы используете Core 3.0 или перенесли свой проект на Core 3.0, вы можете рассмотреть возможность перехода на Маршрутизация на конечную точку [Документы Microsoft] примерно так:

app.UseEndpoints(endpoints =>
{
    endpoints.MapDefaultControllerRoute();
    endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

В Core 3.0 рекомендуется использовать app.UseEndpoints, если возможно, вместо app.UseMvc.

Недавно я перенес проект с Core 2.2 на Core 3.0. Я также обнаружил, что нужно внести некоторые изменения в метод Configure(IApplicationBuilder app) в Startup.cs. Порядок вызова функций важен:

public void Configure(IApplicationBuilder app)
{
  ...

  app.UseStaticFiles();

  app.UseRouting();
  app.UseCors();

  app.UseAuthentication();
  app.UseAuthorization();

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

См. Раздел Код запуска маршрутизации из Документов Microsoft.

...