我的问题应该有一个简单的答案,但经过几个小时的实验和谷歌搜索,我什么也没有,所以现在我在这里。
我正在使用.net MVC 5 odata 2.0。我正在尝试创建一个适用于get的新odata端点。我已经成功创建了一些可以使用POST的端点,但我似乎无法获得一个可以作为GET使用的端点。
相关代码
WebApiConfig.cs
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Review>("Reviews");
builder.EntitySet<Strategy>("Strategies");
ActionConfiguration ReviewsInStrategy = builder.Entity<Strategy>().Action("ReviewsInStrategy");
ReviewsInStrategy.ReturnsCollectionFromEntitySet<Review>("Reviews");
config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
StrategiesController.cs
[EnableQuery]
public IQueryable<Review> ReviewsInStrategy([FromODataUri] Guid key){
Strategy strategy = db.Strategies.Find(key);
return strategy.Reviews
}
现在我去提琴手并尝试GET
[myurl] /的OData /策略(GUID '[myguid]')/ ReviewsInStrategy
我得到404结果。但是,当我将fiddler更改为POST(没有其他更改 - 我不添加接受标题或内容类型或任何内容)时,它的工作正常。
如何使用GET进行此操作?
答案 0 :(得分:0)
您需要向控制器添加Get函数:
[EnableQuery]
public SingleResult<Strategies> Get([FromODataUri] Guid key)
{
IQueryable<Strategies> result = db.Strategies.Where(p => p.Id == key);
return SingleResult.Create(result);
}
这样您就可以在Strategies-resource上使用GET请求。如果您仍想使用自定义操作,则必须将参数添加到配置中:
ActionConfiguration ReviewsInStrategy = builder.Entity<Strategy>().Action("ReviewsInStrategy").Returns<Review>().Parameter<Guid>("Key");
[HttpGet]
[ODataRoute("ReviewsInStrategy(Key={key})")]
public IHttpActionResult<Review> ReviewsInStrategy([FromODataUri] Guid key){
Strategy strategy = db.Strategies.Find(key);
return Ok(strategy.Reviews);
}
不确定所有这些是否适用于复杂类型Guid
。也许您需要将其更改为字符串并在函数内部解析它。 Here是一篇很好的msdn文章。