2

Dies ist, was mein Controller wie folgt aussieht:Warum funktioniert mein Attribut-Routing nicht?

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

Doch wenn ich fordern Sie die URL /api/Clients/Get wie folgt:

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

ich wieder die folgende Ausnahme:

AmbiguousActionException: Mehrere übereinstimmende Aktionen Die folgenden Aktionen Routendaten angepasst und waren alle Bedingungen erfüllt:

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

Client ist ein HttpClient. Bitte beachten Sie, dass keine GET-Aktion trotz des gleichen Namens, id, mit den Routendaten übereinstimmte.

Was könnte hier falsch sein?

+0

zurückkehren mvc-5? - sieht aus wie asp.net-core-mvc –

+0

@StephenMuecke Es ist Core, mein Fehler. Ich vermische oft MVC 5 und 6. – ProfK

+0

Ist das die gesamte Schnittstelle von 'ClientsController'?Die 3 Aktionsmethoden in der Ausnahmebedingungsnachricht sind nicht im Codebeispiel enthalten. Wenn alle gepostet wurden, müssen wir den Rest Ihrer Routing-Konfiguration sehen, um festzustellen, welche Route die Anfrage für "api/Clients/Get" erfüllt. – NightOwl888

Antwort

0

Ich denke, es gibt einen Tippfehler in der Route, es sollte Client s mit einem (s) am Ende anstelle von Client sein.

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

statt

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

Oder um den Anruf an den Endpunkt ändern:

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

Sie die Attribute verwenden falsch.

Sie haben eine Route auf dem Controller

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

, die api/Clients und Präfix, das auf alle Aktionswege in der Steuerung Karte würde.

das bedeutet also, dass

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

eine GET zu api/Clients/api/Client/Get Spiele wegen der Route Präfix auf dem Controller.

Referenzierung Routing to Controller Actions

Sie müssen die Attribute Routen auf den Aktionen sollte entsprechend

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

Die Löschaktion tatsächlich zu einem HTTP-Refactoring aktualisieren DELETE und sollen ein IActionResult

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