在我的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。

c# - ASP.NET Core  “CreatedAtRoute”失败-LMLPHP
CreatedAtRoute有三个重载。
CreatedAtRoute(object routeValues, object value)
CreatedAtRoute(string routeName, object value)
CreatedAtRoute(string routeName, object routeValues, object value)

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

09-15 20:45