处理Odata / entityset / key / navigation

我们有一个基于ODataSamples-master odata示例的DynamicEdmModelCreation项目的项目。

我们设置了一个路由约定来处理对这个特定控制器的所有请求:

[HttpGet] [EnableQuery] public EdmEntityObjectCollection Get() { ... } [EnableQuery] public IEdmEntityObject Get(string key) { ... } 

我们试着举个例子

/ odata /酒店 – >好的!

/ odata /酒店(1) – >好的!

/ odata /酒店(1)/房间 – >回复:

没有找到路由约定来为模板’〜/ entityset / key / navigation’选择OData路径的操作。

我们看到路由约定很好地处理请求并将其重定向到我们的控制器但没有执行任何方法。 路由公约是:

 public class MatchRoutingConventionService : IODataRoutingConvention { public string SelectAction( ODataPath odataPath, HttpControllerContext controllerContext, ILookup actionMap) { return null; } public string SelectController(ODataPath odataPath, HttpRequestMessage request) { return (odataPath.Segments.FirstOrDefault() is EntitySetPathSegment) ? "HamdleAll" : null; } } 

我们认为问题可能在WebApi中使用了正确的方法来处理请求,因为我们使用的是通用签名IEdmEntityObject Get(字符串键)

在您的控制器中,只有两个名为Get(), Get(string key) 。 结果是:

  1. /odata/Hotels没关系,因为请求可以按惯例路由到Get()方法。

  2. /odata/Hotels(1) ,因为请求可以按惯例路由到Get(string key)

但是 ,您不会创建其他方法来响应其他请求,例如请求示例:

/odata/Hotels(1)/Room

由于没有方法响应~/entityset/key/navigation ,Web API OData无法在控制器中找到方法,因此会抛出上述错误消息。

我的尝试:

  • 我在https://github.com/xuzhg/ODataSamples/commit/289658ab5d7bb50c6270400946990c27809d44bc中创建了一个简单的方法

  • 此外,我还在SelectActionMatchAllRoutingConvention创建了一般的导航属性访问路径。 请参阅提交: https : //github.com/xuzhg/ODataSamples/commit/200c4abd346f14ad258df2b36e8687f8ab7d85e7

您可以修改它以满足您的要求。 希望它可以帮到你。

谢谢。

山姆