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.CreatedAtRouteNegotiatedContentResult1.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.TaskAwaiter1.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

Schreibe einen Kommentar