CreatedAtRoute Routing zu verschiedenen Controller
Ich bin erstellen einer neuen webapi über Attribut-routing erstellen Sie eine verschachtelte route etwa so:
//PUT: api/Channels/5/Messages
[ResponseType(typeof(void))]
[Route("api/channels/{id}/messages")]
public async Task<IHttpActionResult> PostChannelMessage(int id, Message message)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != message.ChannelId)
{
return BadRequest();
}
db.Messages.Add(message);
await db.SaveChangesAsync();
return CreatedAtRoute("DefaultApi", new { id = message.Id }, message);
}
Ich aber zurückgeben möchte, eine route, die nicht geschachtelt, d.h.:
/api/Messages/{id}
definiert ist, auf der Nachrichten-controller. Aber Die CreatedAtRoute Aufruf oben nicht lösen dieser route und stattdessen wirft. Habe ich etwas falsch gemacht, oder hat es keine Unterstützung für das routing zu verschiedenen api-controller? n.b. die route, die ich bin versucht zu treffen, ist nicht ein Attribut route, nur die default.
Ausnahme ist:
Meldung: "Ein Fehler ist aufgetreten."
ExceptionMessage: "UrlHelper.Link darf nicht null zurückgeben."
ExceptionType: "- System.InvalidOperationException"
StackTrace: "bei System.Web.Http.Ergebnisse.CreatedAtRouteNegotiatedContentResult1.Execute() at System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult
1.ExecuteAsync(CancellationToken cancellationToken) bei System.Web.Http.Controller.ApiControllerActionInvoker.d__0.MoveNext() --- Ende der Stapelüberwachung vom vorhergehenden Ort, wo die Ausnahme ausgelöst wurde --- bei System.- Laufzeit.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task Task) bei System.- Laufzeit.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task Task) bei System.- Laufzeit.CompilerServices.TaskAwaiter1.GetResult() at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() bei System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()"
Wenn es dies nicht unterstützt, was ist der kanonische Weg, um wieder ein 201 und kann ich es in ein umgestalten sicheren Weg?
InformationsquelleAutor der Frage DanH | 2014-05-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oh je, das kann ein neuer Rekord für die Beantwortung meiner eigenen Frage.
funktioniert der trick. d.h. die explizite Angabe von dem controller. Ich arbeitete diese unsere zu sehen, dass die Ausnahme bezog sich auf den UrlHelper und das Lesen der docs...
InformationsquelleAutor der Antwort DanH
Spät zur party, aber eine alternative Antwort. Wenn die Aktion, die Sie weiterleiten, um auch verwendet Attribut-routing, können Sie der route einen Namen und einen pass, der in der CreatedAtRoute Methode. Dies geschieht, indem ein
Name
Eigenschaft auf dieRoute
. Nach deinem post Beispiel betrachten Sie die folgende Aktion.Beachten Sie, dass die
Name
- Eigenschaft auf die route Attribut[Route("api/messages/{id}", Name="GetMessage")]
gesetzt"GetMessage"
. Durch diese Vorgehensweise können wir nennen dieCreatedAtRoute
Methode aus derPostChannelMessage
Aktion und übergeben Sie den Namen der route ein wie so:Dies ist ein Szenario, das ich gefunden und meine Suche führte hier, so dachte, ich würde post diese alternative Antwort, falls es hilft jemand anderes.
InformationsquelleAutor der Antwort ceej
Nur das hinzufügen zu den Antworten oben: auf Attribut-Routing:
War ich gefangen von dem Namen des Parameters, nahm mir eine Stunde, um zu realisieren, dass der parameter muss richtig benannt, sonst ist der Url-Helper ist, wird null zurückgegeben.
ich.e wenn Sie eine action-Methode wie:
Dann die Rückkehr sollte:
Mehr auf die einfachen Beispiele, die Id-Eigenschaft warfen mich aus, so dass ich dachte, ich würde erweitern auf mehr in dieser Antwort helfen andere mal auf dieses kleine Problem.
Sehen dieses komplizierte Beispiel für mehr detail:
Attribut-Routing und CreatedAtRoute
InformationsquelleAutor der Antwort IbrarMumtaz