gpt4 book ai didi

c# - ASP.NET 核心 "CreatedAtRoute"失败

转载 作者:IT王子 更新时间:2023-10-29 04:21:44 24 4
gpt4 key购买 nike

在我的 ASP.NET Core 应用程序中,我有一个这样的 Controller 操作:

[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)情况是:

System.InvalidOperationException: No route matches the supplied values.

异常导致服务返回 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。

The response includes the obj we created and its location.

CreatedAtRoute 有三个重载。

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

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

关于c# - ASP.NET 核心 "CreatedAtRoute"失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36560239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com