.net MVC Odata端点可以在POST上运行,但在GET上运行404s

时间:2015-03-21 06:41:28

标签: asp.net-mvc odata asp.net-web-api

我的问题应该有一个简单的答案,但经过几个小时的实验和谷歌搜索,我什么也没有,所以现在我在这里。

我正在使用.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进行此操作?

1 个答案:

答案 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文章。