ASP.NET Core“CreatedAtRoute”失败
在我的ASP.NET Core应用程序中,我有一个像这样的控制器动作:
[HttpPost] public async Task CreateSubscriber([FromBody] SubscriberDef subscriber) { //...implementation removed var link = Url.Link("SubscriberLink", new { id = subscriber.ID }); return Created(link, null); }
上面的代码按预期工作。 但是,如果我使用内置方法“CreatedAtRoute”,那么我得到一个例外:
[HttpPost] public async Task CreateSubscriber([FromBody] SubscriberDef subscriber) { //...implementation removed return CreatedAtRoute("SubscriberLink", new { id = subscriber.ID }); }
例外是:
System.InvalidOperationException:没有路由与提供的值匹配。
该exception导致服务返回500状态代码。
在任何一种情况下它都是相同的路由,所以我不知道为什么第一个例子正常工作而第二个例子没有。
我的project.json
包含这个:
"frameworks": { "dnx46": { }, "dnxcore50": { } },
为了参考起见,命名路由由两部分组成。 首先是控制器前缀:
[Route("api/[controller]")] public class SubscribersController : Controller { // ... }
第二个是GET操作,其中实际的"SubscriberLink"
路由命名为:
[HttpGet("{id}", Name = "SubscriberLink")] [SwaggerResponse(HttpStatusCode.OK, Type = typeof(Subscriber))] public async Task GetSubscriber(Guid id) { //...implementation removed... return Ok(subscriber); }
思考?
简答
您正在使用CreatedAtRoute
的错误重载。 使用带有三个参数的重载。
工作实例
例如,以下工作在我的机器上。
[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); } }
细节
结果是201响应。 响应的主体包含我们创建的实体的详细信息( value
参数),响应的Location头包含实体的URI。
CreatedAtRoute
有三个重载。
CreatedAtRoute(object routeValues, object value) CreatedAtRoute(string routeName, object value) CreatedAtRoute(string routeName, object routeValues, object value)
如果我们想传递路由名称和路由值,我们使用带有三个参数的重载。 如果我们不想返回我们创建的实体的细节,我们可以为第三个参数传递null
,