Я хочу вызвать веб-API ASP.NET Core 2.1.0 с помощью метода контроллера.

Я пробовал подписаться, но получаю сообщение об ошибке

Не удается получить / 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], но тщетно.

0
Ramesh 8 Окт 2018 в 18:51

2 ответа

Лучший ответ

Еще раз проверьте определенные маршруты для контроллера.

[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 });
    }
}

Ссылка Маршрутизация к действиям контроллера в ASP.NET Core

1
Nkosi 8 Окт 2018 в 16:17

Во-первых, сопоставленные маршруты и маршрутизация атрибутов - это вопрос или / или. Если у вас задействованы атрибуты маршрута, определение маршрута в вашем Startup вообще не применимо.

Во-вторых, вы не можете просто бросить [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 });
}
0
Chris Pratt 8 Окт 2018 в 16:07