Asp. Net Базовая маршрутизация Core Api - PullRequest
0 голосов
/ 16 февраля 2020

У меня очень основы c Asp. Net Core Api; мой контроллер выглядит следующим образом:

[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    [HttpGet("{id}")]
    public IEnumerable<Resource> Test(string id)
    {
         // Breakpoint here
    }

Я ожидал бы, что следующий URL вызовет метод и сработает точка останова:

https://localhost:5012/test/test/1

Однако это не так. Фактически, следующий URL делает:

https://localhost:5012/test/1

У меня сложилось впечатление, что формат для URL был следующим (из автозагрузки):

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

Так, если только это действие это Index:

https://localhost:5012/controller/action/id    

Но похоже, что принятый формат:

https://localhost:5012/controller/id    

Мой вопрос: почему это так?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

В дополнение к pwrigshihanomoronimo answer

вы можете просто изменить

[HttpGet("{id}")]
public IEnumerable<Resource> Test(string id)

на

[HttpGet("[action]/{id}")]
public IEnumerable<Resource> Test(string id)
0 голосов
/ 16 февраля 2020

На самом деле это атрибут ApiController, который нарушает вашу маршрутизацию. Похоже, app.UseEndpoints настраивает маршруты только для MVC. Таким образом, решение состоит в том, чтобы удалить все атрибуты, чтобы иметь следующий код

public class TestController : ControllerBase
{
    public string Test(string id)
    {
        return "OK";
    }
}

. Или, если вы хотите сохранить атрибут ApiController, вам также необходимо настроить значение Route. Вы можете удалить app.UseEndpoints, если вы не используете MVC в своем проекте

[ApiController]
[Route("[controller]/[action]")]
public class TestController : ControllerBase
{
    [HttpGet("{id}")]
    public string Test(string id)
    {
        return "OK";
    }
}
...