如何使用控制器方法调用API

时间:2018-10-08 15:51:26

标签: c# asp.net-core-2.1

我想使用控制器的方法来调用ASP.NET Core 2.1.0 Web API。

我尝试关注,但出现错误

  

无法获取/ api / remote / NewAc / test1

代码:

[Route("api/remote/{action}")]
//[Route("api/[controller]")]
[ApiController]
public class RemoteController : ControllerBase
{
    private readonly MyContext _context;

    public RemoteValsController(MyContext context)
    { _context = context; }

    [HttpGet]
    public async Task<OkObjectResult> NewAc()
    {
        var r = await _context.TypeOfAccounts.AnyAsync();
        return Ok(new { r = true });
    }

    [HttpGet("{id}")]
    public async Task<OkObjectResult> NewAc([FromRoute] string AccountType)
    {
        var r = await _context.TypeOfAccounts.AnyAsync(o => o.AccountType.ToUpper() == AccountType.ToUpper());
        return Ok(new { r = !r });
    }
}

Startup.cs

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

我尝试了[HttpPost][HttpGet],但是徒劳。

2 个答案:

答案 0 :(得分:1)

重新检查为控制器定义的路由。

[Route("api/remote/[action]")] //<-- NOTE Token replacement in route templates
[ApiController]
public class RemoteController : ControllerBase {
    private readonly MyContext _context;

    public RemoteController(MyContext context) { 
        _context = context; 
    }

    //GET api/remote/NewAc
    [HttpGet]
    public async Task<IActionResult> NewAc() {
        var r = await _context.TypeOfAccounts.AnyAsync();
        return Ok(new { r = true });
    }

    //GET api/remote/NewAc/test1
    [HttpGet("{accountType}")]
    public async Task<IActionResult> NewAc(string accountType) {
        var r = await _context.TypeOfAccounts.AnyAsync(o => o.AccountType.ToUpper() == accountType.ToUpper());
        return Ok(new { r = !r });
    }
}

引用Routing to controller actions in ASP.NET Core

答案 1 :(得分:0)

首先,映射的路由和属性路由是一个/或一个事务。如果涉及到路由属性,则“启动”中的路由定义根本不适用。

第二,您不能仅将[FromRoute]放在参数之前,然后神奇地将其放在路径中。实际上,该属性根本不是必需的,除非对参数值实际来自何处有一些歧义。如果要从路由中获取,则它必须是路由模板的一部分。简单地:

[HttpGet("{id}/{AccountType}")]
public async Task<OkObjectResult> NewAc(string AccountType)
{
    var r = await _context.TypeOfAccounts.AnyAsync(o => o.AccountType.ToUpper() == AccountType.ToUpper());
    return Ok(new { r = !r });
}