3 votes

Pourquoi le routage de mes attributs ne fonctionne-t-il pas ?

Voici à quoi ressemble mon contrôleur :

[Route("api/[controller]")]
[Produces("application/json")]
public class ClientsController : Controller
{
    private readonly IDataService _clients;

    public ClientsController(IDataService dataService)
    {
        _clients = dataService;
    }

    [HttpPost]
    public int Post([Bind("GivenName,FamilyName,GenderId,DateOfBirth,Id")] Client model)
    {
        // NB Implement.
        return 0;
    }

    [HttpGet("api/Client/Get")]
    [Produces(typeof(IEnumerable<Client>))]
    public async Task<IActionResult> Get()
    {
        var clients = await _clients.ReadAsync();
        return Ok(clients);
    }

    [HttpGet("api/Client/Get/{id:int}")]
    [Produces(typeof(Client))]
    public async Task<IActionResult> Get(int id)
    {
        var client = await _clients.ReadAsync(id);
        if (client == null)
        {
            return NotFound();
        }

        return Ok(client);
    }

    [HttpGet("api/Client/Put")]
    public void Put(int id, [FromBody]string value)
    {
    }

    [HttpGet("api/Client/Delete/{id:int}")]
    public void Delete(int id)
    {
    }
}

Pourtant, lorsque je demande l'URL /api/Clients/Get comme suit :

json = await Client.GetStringAsync("api/Clients/Get");

Je reçois l'exception suivante :

AmbiguousActionException : Plusieurs actions correspondent. Les actions suivantes suivantes correspondaient aux données de l'itinéraire et toutes les contraintes étaient satisfaites :

Assessment.Web.Controllers.ClientsController.Index (Assessment.Web) Assessment.Web.Controllers.ClientsController.Details (Assessment.Web) Assessment.Web.Controllers.ClientsController.Create (Assessment.Web)

Client est un HttpClient . Veuillez noter qu'aucune action GET ne correspond aux données de l'itinéraire, malgré le même nom, id .

Qu'est-ce qui ne va pas ?

5voto

Nkosi Points 95895

Vous utilisez mal les attributs.

Vous avez un itinéraire sur le contrôleur

[Route("api/[controller]")]

qui correspondrait à api/Clients et la préfixe à toutes les routes d'action du contrôleur.

Cela signifie donc que

[HttpGet("api/Client/Get")] // Matches GET api/Clients/api/Client/Get
[Produces(typeof(IEnumerable<Client>))]
public async Task<IActionResult> Get()
{
    var clients = await _clients.ReadAsync();
    return Ok(clients);
}

Fait correspondre un GET à api/Clients/api/Client/Get à cause du préfixe de route sur le contrôleur.

Référencement Routage vers les actions du contrôleur

Vous devez mettre à jour les routes d'attributs sur les actions en conséquence

[Route("api/[controller]")]
[Produces("application/json")]
public class ClientsController : Controller {
    private readonly IDataService _clients;

    public ClientsController(IDataService dataService)
    {
        _clients = dataService;
    }

    [HttpPost] //Matches POST api/Clients
    public int Post([Bind("GivenName,FamilyName,GenderId,DateOfBirth,Id")] Client model) {
        // NB Implement.
        return 0;
    }

    [HttpGet("Get")] //Matches GET api/Clients/Get
    [Produces(typeof(IEnumerable<Client>))]
    public async Task<IActionResult> Get() {
        //...code removed for brevity
    }

    [HttpGet("Get/{id:int}")] //Matches GET api/Clients/Get/5
    [Produces(typeof(Client))]
    public async Task<IActionResult> Get(int id) {
        //...code removed for brevity
    }

    [HttpGet("Put")] //Matches PUT api/Clients/Put
    public void Put(int id, [FromBody]string value) {
        //...code removed for brevity
    }

    [HttpGet("Delete/{id:int}")] //Matches GET api/Clients/Delete/5
    public void Delete(int id) {
    }
}

L'action de suppression devrait en fait être transformée en une action HTTP DELETE et devrait renvoyer une valeur de IActionResult

[HttpDelete("Delete/{id:int}")] //Matches DELETE api/Clients/Delete/5
public IActionResult Delete(int id) {
    //...code removed for brevity
}

0voto

Je pense qu'il y a une faute de frappe dans l'itinéraire, il devrait s'agir de Client. s avec un (s) à la fin au lieu de Client.

[HttpGet("api/Clients/Get")]

au lieu de

[HttpGet("api/Client/Get")]

Ou modifiez l'appel au point d'extrémité en :

 json = await Client.GetStringAsync("api/Client/Get");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X