繁体   English   中英

ASP.NET Core“CreatedAtRoute”失败

[英]ASP.NET Core “CreatedAtRoute” Failure

在我的ASP.NET Core应用程序中,我有一个像这样的控制器动作:

[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);
}

思考?

简答

您正在使用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。

响应包括我们创建的obj及其位置。

CreatedAtRoute有三个重载。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM