在我的ASP.NET Core应用程序内部,我有一个类似 Controller 的 Action :
[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 });
}
异常(exception)是:
该异常导致服务返回500状态代码。
无论哪种情况,它都是相同的路线,所以我不知道为什么第一个示例正确工作,而第二个示例却行不通。
我的
project.json
包含以下内容:"frameworks": {
"dnx46": { },
"dnxcore50": { }
},
为了引用起见,命名的路由由两部分组成。首先是 Controller 前缀:
[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 header 包含该实体的URI。CreatedAtRoute
有三个重载。CreatedAtRoute(object routeValues, object value)
CreatedAtRoute(string routeName, object value)
CreatedAtRoute(string routeName, object routeValues, object value)
如果要传递路由名称和路由值,则使用带有三个参数的重载。如果我们不想返回创建的实体的详细信息,则可以将
null
传递给第三个参数,