ASP.NET Core“CreatedAtRoute”失败

时间:2016-04-11 22:15:19

标签: c# asp.net-core

在我的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);
}

思想?

1 个答案:

答案 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。

StorageFactory

CreatedAtRoute有三次重载。

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

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