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。

响应包括我们创建的obj及其位置。

CreatedAtRoute有三个重载。

 CreatedAtRoute(object routeValues, object value) CreatedAtRoute(string routeName, object value) CreatedAtRoute(string routeName, object routeValues, object value) 

如果我们想传递路由名称和路由值,我们使用带有三个参数的重载。 如果我们不想返回我们创建的实体的细节,我们可以为第三个参数传递null