在我的ASP.NET核心应用程序中,我有一个像这样的控制器动作:
[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);
}
思想?
答案 0 :(得分:34)
您正在使用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
传递给第三个参数,