1

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

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)
    {
        ...
    }
}

在我的情况下,我在返回 CreatedAtRoute 时收到“InvalidOperationException:没有路由与提供的值匹配”。我可以通过将代码更改为:

return Created($"{baseUri}/odata/Task({id})", new object());

有没有办法使用 CreatedAtRoute 并使其返回正确的 OData 路径?

4

2 回答 2

1

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

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

更新:

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

return Created(new object());

这将返回 201,在 location 标头中带有特定于 OData 的创建路由。

于 2020-01-21T11:10:31.383 回答
0

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

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

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

于 2019-09-27T00:17:29.223 回答