Маршрутизация URL с asp.net - PullRequest
0 голосов
/ 11 января 2019

Я новичок в asp.net. Я хочу создать веб-сервис, используя asp.net. Я создал проект, используя этот урок .

У меня есть эти классы:

public class QRCodeItem
{        
    [Key]
    public Byte Version { get; set; }        
    public int PrintPPI { get; set; }
    public int CellSize { get; set; }
}


[Route("api/QRCode")]
[ApiController]
public class QRCodeController : ControllerBase
{
    [HttpGet]
    [Route("/CreateCode/{Version}/{PrintPPI}/{CellSize}")]
    public async Task<ActionResult<IEnumerable<QRCodeItem>>> CreateCode(Byte Version = 1, int PrintPPI = 300, int CellSize = 5)
    {
        return await _context.QRCodeItems.ToListAsync();
    }

    [HttpGet]
    public async Task<ActionResult<IEnumerable<QRCodeItem>>> GetQRCodeItems()
    {
        return await _context.QRCodeItems.ToListAsync();
    }
}

Я пытаюсь получить доступ к CreateCode с этим URL:

https://localhost:44349/api/CreateCode?Version=1&PrintPPI=300&CellSize=2

Но я не могу вызвать метод. Как я могу позвонить CreateCode, используя этот URL? Я могу изменить метод, но не URL.

URL работает с:

https://localhost:44349/api/QRCode

Метод GetQRCodeItems вызывается.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Маршрут, определенный в методе, добавляется к маршруту, определенному на уровне класса, поэтому он будет: https://localhost:44349/api/QRCode/CreateCode?Version=1&PrintPPI=300&CellSize=2.

0 голосов
/ 11 января 2019

Для использования текущего кода

[Route("api/QRCode")] - это базовый маршрут для всех действий в контроллере.

Значение в атрибуте Route метода присоединяется к базовому маршруту контроллера.

Таким образом, для [Route("CreateCode/{Version}/{PrintPPI}/{CellSize}")] (обратите внимание на удаление символа первой косой черты) полный маршрут:

api/QRCode/CreateCode/{Version}/{PrintPPI}/{CellSize}

https://localhost:44349/api/QRCode/CreateCode/1/300/2

Изменение кода для соответствия URL

Просто оставьте свой маршрут до: [Route("CreateCode")]

Это работает, потому что фактический URL-маршрут заканчивается на .../CreateCode без строки запроса. Параметры после ? будут выбраны из строки запроса.

Extra

Microsoft Docs - Объединение маршрутов о том, как правильно комбинировать маршруты

Шаблоны маршрутов, примененные к действию , которые начинаются с / не получить в сочетании с шаблонами маршрутов, примененными к контроллеру . Этот пример соответствует набору путей URL, аналогичных маршруту по умолчанию

[Route("Home")]
public class HomeController : Controller
{
    [Route("")]      // Combines to define the route template "Home"
    [Route("Index")] // Combines to define the route template "Home/Index"
    [Route("/")]     // Doesn't combine, defines the route template ""
    public IActionResult Index()
    {
        ViewData["Message"] = "Home index";
        var url = Url.Action("Index", "Home");
        ViewData["Message"] = "Home index" + "var url = Url.Action; =  " + url;
        return View();
    }

    [Route("About")] // Combines to define the route template "Home/About"
    public IActionResult About()
    {
        return View();
    }   
}
...