Return 来自 ODataController 的 CreatedAtRoute 位置

Return CreatedAtRoute location from ODataController

我有一个带有 Post 方法的 ODataController,它应该 return 一个 URL 到一个新创建的 OData 资源,如下所示:

public class TasksController: ODataController
{
    [HttpPost]
    public IActionResult Post([FromBody] Request request)
    {
        ...
        return CreatedAtRoute("GetTask", new Dictionary<string, object>{{"id", id}}, new object());
    }

    [ODataRoute(RouteName = "GetTask")]
    public IActionResult Get(int key)
    {
        ...
    }
}

在我的例子中,当 returning CreatedAtRoute 时,我得到 "InvalidOperationException: No route matches the supplied values"。我可以通过将代码更改为:

来解决此问题
return Created($"{baseUri}/odata/Task({id})", new object());

有什么方法可以改用 CreatedAtRoute 并使其 return 正确的 OData 路径?

您在 Created 方法中返回的路线:"{baseUri}/odata/Task({id})" 不存在。最简单的解决方法是更改​​ URL 以匹配您的控制器方法。

变化:$"{baseUri}/odata/Task({id})"

匹配$"{baseUri}/odata/GetTask({id})"

我也有这个问题。我能够通过将 "odataPath" 添加到 routeValues:

来让它工作
return CreatedAtAction(nameof(Get), new { id, odataPath = $"{baseUri}/odata/Task({id})" }, new object());

更新:

我确实找到了 alternate/better 方法。从 ODataController 继承时,您可以访问两个额外的结果类型:CreatedODataResult<TEntity>UpdatedODataResult<TEntity>。所以这有效:

return Created(new object());

returns 201 与 OData-specific 在位置 header 创建路线。