【发布时间】:2014-06-18 12:19:19
【问题描述】:
我正在创建一个新的 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);
}
但是,我想返回一个未嵌套的路由,即:
/api/Messages/{id}
在消息控制器上定义。然而,上面的 CreatedAtRoute 调用并没有解决这个路由而是抛出。我做错了什么,还是不支持路由到不同的 api 控制器?注意我要命中的路由不是属性路由,只是默认路由。
例外是:
消息:“发生错误。” ExceptionMessage:“UrlHelper.Link 不得返回 null。” 异常类型:“System.InvalidOperationException” StackTrace:“在 System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult
1.Execute() at System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult1.ExecuteAsync(CancellationToken cancelToken) at System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext() --- 堆栈跟踪从上一个位置结束异常被抛出---在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 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.TaskAwaiter1.GetResult()在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()"
如果它不支持这一点,返回 201 的规范方法是什么?我可以以重构安全的方式来做吗?
【问题讨论】:
标签: c# asp.net-web-api asp.net-web-api-routing attributerouting