Почему мой маршрут C#. Net Core Rest API не находит мой метод? - PullRequest
2 голосов
/ 12 июля 2020

Я работаю над API. У меня есть «AbstractController.cs», и мне трудно вызвать GET с двумя параметрами.

[Route("api/[controller]")]
[ApiController]
public class AbstractController : ControllerBase
{
    // GET: api/Abstract
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "missing implementation" };
    }

Переход к https://localhost: 44363 / api / abstract / генерирует это. ["отсутствующая реализация"] Замечательно!

Теперь мне нужно создать метод Get, который проходит в год показа, и код для запроса SQL. Достаточно просто?

// GET: api/Abstract?ShowYear=2019&ShowCode=248621
    [Route("api/{controller}/{ShowYear}/{ShowCode}")]
    [HttpGet]
    public Abstract Get(int ShowYear, int ShowCode) // GetAbstractByYearAndSHCode
    {
        string x = "";
        return new Abstract();
    }

Независимо от того, что я делаю, я не могу получить этот метод до точки останова / ввода выполнения! Я предполагаю, что это проблема маршрутизации, но я пробовал наиболее надежные способы вызова конечной точки.

enter image description here

Now I check the MS Documentation like any self-respecting-learning-programmer would. https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-3.1

Endpoint маршрутизация в ASP. NET Core 3.0 и новее:

Не имеет концепции маршрутов. Не предоставляет гарантии упорядочивания для выполнения расширяемости, все конечные точки обрабатываются одновременно.

GULP Звучит страшно.

Я пока не касался своего промежуточного программного обеспечения.

Во всех рассмотренных мной примерах нет моих «MapControllers ();» в их Startup.cs. Это связано с тем, что он новичок в. NET Core 3.0 / 3.1 Метод: « Добавляет конечные точки для действий контроллера в IEndpointRouteBuilder без указания каких-либо маршрутов. »

Хорошо, у меня есть здесь еще вручную указать маршрут? Я сделал это, и это вроде как работает.

Ну, теперь точки останова в startup.cs, когда я go - https://localhost: 44363 / api / abstract / 2019/287 enter image description here

Wait, it's not doing ANYTHING with my controller code! Why?

The following (also above) code ends up declaring as a null in the startup.cs

                    var controller = context.Request.RouteValues["Abstract"];

Hoping to learn what I'm doing wrong.

MapGet("/api/abstract/{showYear}/{showCode}", ...);

Isn't this code responsible for mapping that route with the controller named AbstractController.cs in my Controllers folder? Not hitting any breakpoints.

Edit: Reading through this which compares the differences in the Startup.cs from .Net Core 2, 2.2, MVC projects vs 3.0 I have a good feeling reading all of this, I will find the issue. https://andrewlock.net/comparing-startup-between-the-asp-net-core-3-templates/ Редактировать ... nevermind не нашел разрешения.

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

Полное комментирование этого проблемного кода в startup.cs:

endpoints.MapGet("/api/abstract/{showYear}/{showCode}", async context =>
            {
                var controller = context.Request.RouteValues["Abstract"];

                var showYear = context.Request.RouteValues["showYear"];
                var showCode = context.Request.RouteValues["showCode"]; // just an example.
                //await context.Response.WriteAsync($"Hello {showYear} is your year, {showCode} for the code!");
                //GetAbstractByYearAndSHCode();
            });
            
            endpoints.MapGet("/api/abstract/{showYear}", async context =>
            {
                var name = context.Request.RouteValues["name"];
                await context.Response.WriteAsync($"Hello {name}!");
            });

Решает мою проблему невозможности доступа к контроллеру.

enter image description here

https://localhost:44363/api/abstract/2019 hits, and the id value is 2019. Great. https://i.imgur.com/rmHyDPg.png результат выглядит великолепно.

Я все еще не могу использовать параметр> 1. Как мне просто использовать параметры Year и ShowCode? Какой синтаксис? https://localhost: 44363 / api / abstract / 2019

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Маршрут "api / abstract" уже используется первым методом. Вы не можете использовать его снова для других действий. Создайте новый, как показано в строке.

[HttpGet("{GetAbstractByYearAndSHCode}",Name = "GetAbstractByYearAndSHCode")]
public Abstract Get(int ShowYear, int ShowCode) // GetAbstractByYearAndSHCode
{
    string x = "";
    return new Abstract();
}

И вызовите URL-адрес, как показано:

https://localhost/api/abstract/GetAbstractByYearAndSHCode?ShowYear=1&ShowCode=5

1 голос
/ 12 июля 2020

Просто добавьте параметры в свой атрибут


[HttpGet("{ShowYear}/{ShowCode}")]

...