2015-11-03 54 views
0

所以我想以这种方法来绘制作为OData的功能...定制的OData v4的函数总是返回406

[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

问题:?

该请求从该方法执行我的代码,并返回,则该客户端获得一个406

任何想法?

回答

0

是的。 @Ouyang表示配置错误。此外,如我所见,还有其他四种错误:

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

    TRDetails/Namespace.ForBuyerOrganisations(...)

  3. 你应该设置参数为列表,因为你的配置它作为收藏。

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

所以,下面的请求是请求示例:

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

嗯在这种情况下,它的工作原理(谢谢@Sam许),我有间歇性的成功让这个工作,虽然有其他功能......有没有一种方法来映射这不需要在url中的命名空间,或者这是必须使用的约定? – War

+0

是的,不合格的函数/动作调用就是你要找的东西,详情请看[这里](http://odata.github.io/WebApi/#06-01-custom-url-parsing) –

0

如果TRDetails是EntitySet的,

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

我想你错过了EntitySet的名称。

+0

这就是上面我的代码一个错字......这不工作,要么恐怕:( – War