具有“实体或实体引用集合”类型参数的OData函数

时间:2015-12-03 15:33:36

标签: c# asp.net web-services odata

我有一个关于OData绑定函数的问题,参数类型为“实体或实体参考集合”。当我试图调用该函数时,我没有进入我的函数但得到HTTP错误(见下文)。此参数类型的描述来自http://odata.github.io/WebApi/#04-06-function-parameter-support。 我正在使用ASP.Net MVC 2和ASP.NET OData 5.7.0,编程语言C#实现OData V4服务。

我的功能代码:

[HttpGet]  
public IHttpActionResult GetTimeSeriesTest2([FromODataUri] IEnumerable<Tag> tags)  
{  
     ... some Code  
}   

模型中函数声明的代码:

var tag = builder.EntityType<Tag>();  
funcCol = tag.Collection.Function("GetTimeSeriesTest2");  
funcCol.ReturnsCollectionFromEntitySet<Measurement>("Measurements");  
funcCol.CollectionEntityParameter<Tag>("tags");  

可以访问标签实体的“标签”集合,标签具有字符串类型的键。查询Tags集合并获得单个标记工作正常(例如http:// localhost:51100 / odata / Tags('0'))

在WebApiConfig.cs中调用OData路由:

config.MapODataServiceRoute("OData", "odata", model: GetEdmModel());

我的OData查询在Internet Explorer中使用:
查询:
http:// localhost:51100 / odata / Tags / Default.GetTimeSeriesTest2(tags = @ x)?@ x = {\“value \”:[{\“@ odata.id \”:\“http://localhost:51100/odata/Tags ( '0')\“}]}
- &GT;我收到HTTP错误404.0 - 未找到。

如果我使函数解除绑定并在没有命名空间“默认”的情况下调用它,则执行该函数但是tags参数为空。 如果我将IEnumerable类型从Tag更改为Int并使用以下查询一切正常: http:// localhost:51100 / odata / Tags / Default.GetTimeSeriesTest2(tags = @ x)?@ x = [4,5,6]

出了什么问题以及如何解决? 任何帮助都是受欢迎和赞赏的。

提前致谢

克劳斯·彼得

1 个答案:

答案 0 :(得分:0)

您应编码Tag数据参数。 网址应为

http ://localhost:51100/odata/Tags/Default.GetTimeSeriesTest2(tags=@x)?@x=%7B%22value%22%3A%5B%7B%22%40odata.id%22%3A%22http%3A%2F%2Flocalhost%3A51100%2Fodata%2FTags('0')%22%7D%5D%7D

您可以在JS中使用encodeURIComponent方法进行编码。