我是asp.net的新手。我想使用asp.net创建一个Web服务。我使用this tutorial创建了一个项目。

我有这些课:

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

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


但是我无法调用该方法。如何使用此URL调用CreateCode?我可以更改方法,但不能更改URL。

网址正在使用:

https://localhost:44349/api/QRCode


调用方法GetQRCodeItems

最佳答案

使用当前代码

[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结尾而没有查询字符串。 ?之后的参数将从查询字符串中选取。

额外

Microsoft Docs - Combining routes关于如何正确组合路线


应用于以/开头的动作的路径模板
结合应用于控制器的路由模板。这个例子
匹配类似于默认路由的一组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();
    }
}

10-06 08:58