【问题标题】:WebAPI OData routing: parameterized prefix in odataPathWebAPI OData 路由:odataPath 中的参数化前缀
【发布时间】:2023-03-27 03:33:02
【问题描述】:

对于 WebAPI 2 OData 解决方案,我们需要能够映射以下路由类型:

~/odata/1234erp/Products 表示控制器(或实体集)段的值前缀。我的路线设置如下:

    config.Routes.MapODataRoute(
        routeName: "odata",
        routePrefix: "odata/{tableid}/{controller}", 
        model: ModelBuilder.GetEdmModel(), 
        pathHandler: new DefaultODataPathHandler(),
        routingConventions: conventions);

这使得我的 CustomControllerRoutingConvention 中的 SelectAction 方法被命中(SelectController 没有被命中)但是 odataPath 参数计算 0 个段,我希望它能够识别类似 ~/tableid/entityset/ em>

现在我可能可以使用类似的方法解决这个问题

controllerContext.RequestContext.RouteData.Values["tableid"]

但是有更好的(类型安全的?)解决方案吗?

编辑: 此外,由于 ODataPath path = Request.GetODataPath() 返回 0 个段,因此不再可能派生 ODataQueryOptions 所需的 EdmType...

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案1】:

    像这样去掉 routePrefix 的 {controller} 段:"odata/{tableid} 似乎解决了这个问题。现在我可以像这样直接指向正确的控制器

        if (firstSegment != null && firstSegment is EntitySetPathSegment)
        {
            return firstSegment.ToString();
        }
    

    在那个控制器中,我可以获取 tableid 作为参数:Get(string tableid)

    更好,

    ODataPath path = Request.GetODataPath();
    IEdmType edmType = path.EdmType;
    

    返回正确的 EdmType...

    【讨论】:

    • 虽然这可行,但我还没有弄清楚当我在控制器中时如何以类型安全的方式“提取”tableid。我可以这样做:var tableid = ControllerContext.Request.RequestUri.Segments[2].TrimEnd('/'); 但这并不理想。无论如何以类型安全的方式执行此操作?
    猜你喜欢
    • 1970-01-01
    • 2016-09-28
    • 2014-03-14
    • 2014-03-01
    • 2019-11-04
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多