![](/img/trans.png)
[英]ASP.NET Core 2.2 - CreatedAtRoute method failure for complex routes
[英]ASP.NET Core “CreatedAtRoute” Failure
在我的ASP.NET Core应用程序中,我有一个像这样的控制器动作:
[HttpPost]
public async Task<IActionResult> CreateSubscriber([FromBody] SubscriberDef subscriber)
{
//...implementation removed
var link = Url.Link("SubscriberLink", new { id = subscriber.ID });
return Created(link, null);
}
上面的代码按预期工作。 但是,如果我使用内置方法“CreatedAtRoute”,那么我得到一个例外:
[HttpPost]
public async Task<IActionResult> CreateSubscriber([FromBody] SubscriberDef subscriber)
{
//...implementation removed
return CreatedAtRoute("SubscriberLink", new { id = subscriber.ID });
}
例外是:
System.InvalidOperationException:没有路由匹配提供的值。
该异常导致服务返回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<IActionResult> 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
,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.