2016-04-11 35 views
19

Dentro il mio ASP.NET Nucleo app che hanno un azione di controllo come questo:ASP.NET core "CreatedAtRoute" Il fallimento

[HttpPost] 
public async Task<IActionResult> CreateSubscriber([FromBody] SubscriberDef subscriber) 
{ 
    //...implementation removed 

    var link = Url.Link("SubscriberLink", new { id = subscriber.ID }); 
     return Created(link, null); 
} 

Il codice precedente funziona come previsto. Tuttavia, se uso il metodo "CreatedAtRoute" built-in, allora ottengo un'eccezione:

[HttpPost] 
public async Task<IActionResult> CreateSubscriber([FromBody] SubscriberDef subscriber) 
{ 
    //...implementation removed 

    return CreatedAtRoute("SubscriberLink", new { id = subscriber.ID }); 
} 

L'eccezione è:

System.InvalidOperationException: Nessun percorso corrisponde ai valori forniti.

L'eccezione fa sì che il servizio restituisca un codice di stato 500.

In entrambi i casi è lo stesso percorso, quindi non so perché il primo esempio funzioni correttamente e il secondo no.

mio project.json contiene questo:

"frameworks": { 
    "dnx46": { }, 
    "dnxcore50": { } 
}, 

Per l'amor di riferimento, il percorso di nome è composto da due pezzi. In primo luogo è il prefisso di controllo:

[Route("api/[controller]")] 
public class SubscribersController : Controller 
{ 
    // ... 
} 

In secondo luogo è l'azione GET, dove l'attuale percorso "SubscriberLink" prende il nome:

[HttpGet("{id}", Name = "SubscriberLink")] 
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(Subscriber))] 
public async Task<IActionResult> GetSubscriber(Guid id) 
{ 
    //...implementation removed... 
    return Ok(subscriber); 
} 

Pensieri?

+1

Dove è definito il nome della route 'SubscriberLink'? – haim770

+0

@ haim770 È definito nell'ultimo spezzone di codice. –

+0

'var link = Url.Link (" SubscriberLink ", nuovo {id = subscriber.ID});' restituisce l'Url corretto o semplicemente non genera un'eccezione? – haim770

risposta

25

Risposta breve

Si utilizza il sovraccarico sbagliato di CreatedAtRoute. Usa il sovraccarico che richiede invece tre argomenti.

Esempio di lavoro

Per esempio, le seguenti opere sulla mia macchina.

[Route("api/[controller]")] 
public class SubscribersController : Controller 
{ 
    public IActionResult Index() 
    { 
     var subscriber = new 
     { 
      Id = Guid.NewGuid(), 
      FirstName = "Shaun", 
      LastName = "Luttin" 
     }; 

     // overload with three arguments 
     return CreatedAtRoute(
      routeName: "SubscriberLink", 
      routeValues: new { id = subscriber.Id }, 
      value: subscriber); 
    } 

    [HttpGet("{id}", Name = "SubscriberLink")] 
    public IActionResult GetSubscriber(Guid id) 
    { 
     var subscriber = new 
     { 
      Id = id, 
      FirstName = "Shaun", 
      LastName = "Luttin" 
     }; 

     return new JsonResult(subscriber); 
    } 
} 

dettagli

Il risultato è una risposta 201. Il corpo della risposta contiene i dettagli dell'entità creata (l'argomento value) e l'intestazione Location della risposta contiene un URI all'entità.

The response includes the obj we created and its location.

ci sono tre sovraccarichi per CreatedAtRoute.

CreatedAtRoute(object routeValues, object value) 
CreatedAtRoute(string routeName, object value) 
CreatedAtRoute(string routeName, object routeValues, object value) 

Se vogliamo passare un nome percorso e valori di percorso, usiamo il sovraccarico che prende tre argomenti. Se non vogliamo restituire i dettagli dell'entità che abbiamo creato, possiamo passare null per il terzo argomento,

+0

Dovrebbe essere [Route ("api/[controller]", Name = "SubscriberLink")] perché nel tuo caso stai impostando il modello del percorso, non il nome. –

+1

Questo è sbagliato. Il nuovo 'HttpGetAttribute' * fa * definisce una proprietà' Name' e implementa anche 'IRouteTemplateProvider' che fornisce il nome della rotta – haim770

+0

@ haim770 Risolto il problema. :) Grazie per il feedback. –

Problemi correlati