Я создаю новый webapi, используя маршрутизацию атрибутов, чтобы создать вложенный маршрут следующим образом:
// 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);
}
Однако я хочу вернуть маршрут, который не вложен i.e.:
/api/Messages/{id}
который определен в контроллере сообщений. Однако вызов, описанный в CreateAtRoute выше, не разрешает этот маршрут и вместо этого бросает. Я сделал что-то неправильно или не поддерживает маршрутизацию на другой контроллер api? нотабене маршрут, который я пытаюсь ударить, не является маршрутом атрибута, просто по умолчанию.
Исключение составляет:
Сообщение: "Произошла ошибка". ExceptionMessage: "UrlHelper.Link не должен возвращать null". ExceptionType: "System.InvalidOperationException" StackTrace: "в System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult
1.Execute() at System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult
1.ExecuteAsync(CancellationToken cancelationToken) в System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext() --- Конец трассировки стека из предыдущего места, где исключение было отправлено --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в System.Runtime.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() в System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()"
Если это не поддерживает это, каков канонический способ вернуть 201, и могу ли я сделать это безопасным способом?