【问题标题】:Additional GetXYZ methods in EntitySetControllerEntitySetController 中的其他 GetXYZ 方法
【发布时间】:2013-06-20 03:10:03
【问题描述】:

我希望能够在我的 EntitySetController 派生控制器类中拥有额外的 GetXYZ 方法。例如:

[HttpGet]
 [Queryable]
        public string GetAirportsWithinRadius(int airportId, int radius)
        {

            var resultAirports = GetAirportsWithinRadius2(airportId, radius);

            return resultAirports;            
        }

这是我的配置:

ActionConfiguration getAirportsWithinRadius =  modelBuilder.Entity<Airport>().Collection.Action("GetAirportsWithinRadius");
        getAirportsWithinRadius.Parameter<int>("airportId");
        getAirportsWithinRadius.Parameter<int>("radius");
        getAirportsWithinRadius.ReturnsCollectionFromEntitySet<Airport>("Airports");

我希望此操作像默认的 Get Queryable 操作一样可组合,但这将是支持所有 odata 参数但另外还支持 airportId 和 radius 的替代方法。这将首先通过半径搜索过滤机场(我知道该怎么做 - 它与问题无关)然后返回 Queryable 以便它可以通过 odata 参数进一步过滤。

我读到的所有内容都说这将是一个 odata 操作,因此必须是一个 POST,但 Get 也是一个操作,它是一个 GET,那么为什么不允许使用附加参数的扩展 getter 呢?我错过了什么吗?我如何完成我想要完成的事情?

我会这样从 ajax 客户端调用它: GET /odata/Airports?$inlinecount=allpages&$top=25&airportId=2112&radius=50

相对于常规的 odata GET: GET /odata/Airports?$inlinecount=allpages&$top=25

谢谢

编辑: 我现在明白这是一个 odata “功能”,它正在考虑作为未来的功能。让我们暂时忘记这个 odata 的含义。它本质上是一个返回 Queryable 的 WebApi HttpGet,对吧?所以,只要我不关心这个“函数”的元数据广告,我怎么能确保它是一个可访问的 HttpGet,形成一个 ODataController 内部的路由透视图? ODataController 需要 MapODataRoute,我可以使用额外的 MapHttpRoutes 额外添加非 odata 路由吗? 我问这个是因为在我看来我应该能够做到,但我所有的尝试都失败了(试图通过提琴手点击 HttpGet)。我找不到使用其他非 OData GET 扩展 ODataController 的示例。有人可以帮我理解这个例子是否以及如何做到这一点?:

[Queryable]
        public IQueryable<Airport> Get()
        {
            return db.Airports;
        }
    [HttpGet]
     [Queryable]
            public string GetAirportsWithinRadius(int airportId, int radius)
            {

                var resultAirports = GetAirportsWithinRadius2(airportId, radius);

                return resultAirports;            
            }

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案1】:

    您正在寻找 OData 函数,它尚不支持开箱即用。我们这边有问题。你可以投票。

    http://aspnetwebstack.codeplex.com/workitem/881

    【讨论】:

    • Arrgg :) 我加了票。这一点非常重要,因为从语义上讲,vanilla Get 有许多业务逻辑扩展。我现在有什么办法可以解决这个问题并完成我想要的吗?我想我可以编写一个额外的 apicontroller...
    • 您应该从 ODataController 派生,以便与 OData 相关的格式化程序出现。但即使我们有这种解决方法,问题是您是否希望在元数据文档上公开此操作/功能。由于 Web API 仅支持 Actions,如果您将其指定为操作,则元数据文档会将其显示为操作,读取文档的客户端会感到困惑并会执行 POST。我猜你可以完全避免在元数据文档上显示这一点。
    • 好的 - 这就是我想要做的:我想使用方便的 EntitySetController 或 ODataController 并添加一个名为 GetAirportsWithinRadius(int airportId, int radius) 的额外 HttpGet。我想将该方法用作我不需要任何元数据的香草 webapi 控制器操作方法(即正式的 odata 函数发现 - 因为它还不存在)。但是我需要手动定义一个允许从说 fiddler 调用它的路由。除了 MapODataRoute 配置之外,还有什么方法可以为此操作添加其他 MapHttpRoute 配置?
    • 无论我做什么,我都会不断收到:“检测到无效操作。'GetAirportsWithinRadius' 不是可以绑定到 'Collection([JumpSeatWeb.Airport Nullable=False])' 的操作”。我似乎无法在 ODataController 派生类中定义一个简单的附加 HttpGet 路由。除了元数据问题之外,是否有任何原因导致默认的 odata 路由配置接管并且不允许任何其他路由发生?
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 2023-02-17
    • 2013-10-05
    • 2014-12-14
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多