处理 Odata /entityset/key/navigation
Handle Odata /entityset/key/navigation
我们有一个基于 ODataSamples-master odata 示例中的 DynamicEdmModelCreation 项目的项目。
我们已经设置了一个路由约定来处理对这个特定控制器的所有请求:
[HttpGet]
[EnableQuery]
public EdmEntityObjectCollection Get()
{
...
}
[EnableQuery]
public IEdmEntityObject Get(string key)
{
...
}
我们举个例子
/odata/Hotels -> 好的!
/odata/Hotels(1) -> 好的!
/odata/Hotels(1)/房间 -> 响应:
No routing convention was found to select an action for the OData path with template '~/entityset/key/navigation'.
调试我们看到路由约定很好地处理了请求并将其重定向到我们的控制器但是没有执行任何方法。路由约定是:
public class MatchRoutingConventionService : IODataRoutingConvention
{
public string SelectAction(
ODataPath odataPath,
HttpControllerContext controllerContext,
ILookup<string, HttpActionDescriptor> actionMap)
{
return null;
}
public string SelectController(ODataPath odataPath, HttpRequestMessage request)
{
return (odataPath.Segments.FirstOrDefault() is EntitySetPathSegment) ? "HamdleAll" : null;
}
}
我们认为问题可能出在 WebApi 选择正确的方法来处理请求,因为我们使用的是通用签名 IEdmEntityObject Get(string key)。
在您的控制器中,只有两个名为 Get(), Get(string key)
的方法。结果是:
/odata/Hotels
可以,因为请求可以按照惯例路由到 Get()
方法。
/odata/Hotels(1)
可以,因为请求可以按照惯例路由到 Get(string key)
。
但是,您没有创建其他方法来响应其他请求,例如请求示例:
/odata/Hotels(1)/Room
由于没有响应~/entityset/key/navigation
的方法,Web API OData在你的控制器中找不到方法,所以它抛出了上面的错误信息。
我的尝试:
我在https://github.com/xuzhg/ODataSamples/commit/289658ab5d7bb50c6270400946990c27809d44bc
中创建了一个简单的方法
此外,我还在SelectAction
MatchAllRoutingConvention
中创建了通用导航属性访问路径。查看提交:
https://github.com/xuzhg/ODataSamples/commit/200c4abd346f14ad258df2b36e8687f8ab7d85e7
您可以修改它以满足您的要求。希望它能帮助你。
谢谢。
山姆
我们有一个基于 ODataSamples-master odata 示例中的 DynamicEdmModelCreation 项目的项目。
我们已经设置了一个路由约定来处理对这个特定控制器的所有请求:
[HttpGet]
[EnableQuery]
public EdmEntityObjectCollection Get()
{
...
}
[EnableQuery]
public IEdmEntityObject Get(string key)
{
...
}
我们举个例子
/odata/Hotels -> 好的!
/odata/Hotels(1) -> 好的!
/odata/Hotels(1)/房间 -> 响应:
No routing convention was found to select an action for the OData path with template '~/entityset/key/navigation'.
调试我们看到路由约定很好地处理了请求并将其重定向到我们的控制器但是没有执行任何方法。路由约定是:
public class MatchRoutingConventionService : IODataRoutingConvention
{
public string SelectAction(
ODataPath odataPath,
HttpControllerContext controllerContext,
ILookup<string, HttpActionDescriptor> actionMap)
{
return null;
}
public string SelectController(ODataPath odataPath, HttpRequestMessage request)
{
return (odataPath.Segments.FirstOrDefault() is EntitySetPathSegment) ? "HamdleAll" : null;
}
}
我们认为问题可能出在 WebApi 选择正确的方法来处理请求,因为我们使用的是通用签名 IEdmEntityObject Get(string key)。
在您的控制器中,只有两个名为 Get(), Get(string key)
的方法。结果是:
/odata/Hotels
可以,因为请求可以按照惯例路由到Get()
方法。/odata/Hotels(1)
可以,因为请求可以按照惯例路由到Get(string key)
。
但是,您没有创建其他方法来响应其他请求,例如请求示例:
/odata/Hotels(1)/Room
由于没有响应~/entityset/key/navigation
的方法,Web API OData在你的控制器中找不到方法,所以它抛出了上面的错误信息。
我的尝试:
我在https://github.com/xuzhg/ODataSamples/commit/289658ab5d7bb50c6270400946990c27809d44bc
中创建了一个简单的方法
此外,我还在
SelectAction
MatchAllRoutingConvention
中创建了通用导航属性访问路径。查看提交: https://github.com/xuzhg/ODataSamples/commit/200c4abd346f14ad258df2b36e8687f8ab7d85e7
您可以修改它以满足您的要求。希望它能帮助你。
谢谢。
山姆