自定义 OData v4 函数始终 returns 406

custom OData v4 function always returns 406

所以我试图将此方法映射为 Odata 函数...

[HttpGet]
[EnableQuery]
public IHttpActionResult ForBuyerOrganisations([FromUri]int[] orgIds)
{
    // this returns IQueryable<TRDetails>
    // i tried throwing a ToList on there too to ensure it works and it does
    var result = service.ForBuyerOrgs(orgIds); 
    return Ok(result);
}

我是这样映射的...

var forBuyers = Builder.EntityType<TRDetails>().Collection.Function("ForBuyerOrganisations");
forBuyers.ReturnsCollection<TRDetails>();
forBuyers.CollectionParameter<int>("orgIds");

...我也试过这个...

var forBuyers = Builder.EntityType<TRDetails>().Collection.Function("ForBuyerOrganisations");
forBuyers.ReturnsCollectionFromEntitySet<TRDetails>();
forBuyers.CollectionParameter<int>("orgIds");

我可以用 url 调用它:

~/TRDetails/ForBuyerOrganisations?orgIds=1

问题:

请求执行我的代码和returns来自这个方法,然后客户端得到一个 406。

有什么想法吗?

如果 TRDetails 是实体集,

forBuyers.ReturnsCollectionFromEntitySet<TRDetails>("TRDetails");

我想你忘记了实体集的名称。

是的。 @Ouyang 表示配置错误。另外,据我看来,还有另外四个错误:

  1. 您应该使用 [FromODataUri],而不是 [FromUri] 作为参数。
  2. 您应该调用带有命名空间限定的函数。

    TRDetails/Namespace.ForBuyerOrganisations(...)

  3. 您应该将参数设置为列表,因为您将其配置为集合。

  4. 您应该使用 () 作为参数调用该函数。

因此,以下请求是示例请求:

~/TRDetails/Default.ForBuyerOrganisations(orgIds=[5,4,2,3,1])