webApi2 Odata v3 and V4 side by side

本文关键字:side by V4 and Odata v3 webApi2 | 更新日期: 2023-09-27 18:20:42

如何让odata v3和v4-api在同一项目上并行工作?

同一个控制器是否可以同时返回两种格式的数据?我需要两个相同控制器的副本吗?每个Odata版本一个?

我知道这应该是可能的,因为官方的WEBAPI页面说它是为之设计的。

"ASP.NET Web API同时支持协议的v3和v4。您甚至可以有一个与v3端点并行运行的v4端点。"-引用自www.ASP.NET

问题是——我该怎么做?有教程吗?

webApi2 Odata v3 and V4 side by side

下面是并排的示例:https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataSxSSample/,FYI。此示例有两个相同控制器的副本。

是的,您确实需要两组控制器。V4不提供向后兼容性。

还有另一个版本控制示例:https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataVersioningSample/

这是适合您的解决方案。您为OData V3制作了第一个版本(~/api/v1/),为V4制作了第二个版本(~ api/v2/)。它提供了更好的分离。

它在一定程度上取决于OData实现。我知道WCF支持OData-Version标头:

http://docs.oasis-open.org/odata/odata/v4.0/os/part1-protocol/odata-v4.0-os-part1-protocol.html#_Toc372793615

客户端可以使用它来指定它想要的版本,WCF将只对一个端点进行适当的操作。

另一方面,我不知道WebAPI,但它可能值得测试。

要总结非常简单的步骤,而不必下载示例,请为v3获取Microsoft.AspNet.WebApi.Odata,为v4获取Microsoft.AspNet.Odata。从使用默认约定连接的v3和v4开始,您将找到一个重复的控制器名称。从这里,将v3默认路由前缀更改为"odata/v3"(不是必需的,但建议使用),对于v4,将默认路由前缀设置为"odata/v4",并将控制器重命名为MyEntityV4Controller。此时,尝试使用路由属性来解决错误将导致http 406结果。相反,创建一个类:

public class CustomControllerRoutingConvention : IODataRoutingConvention
{
    public string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
    {
        return null;
    }
    public string SelectController(ODataPath odataPath, HttpRequestMessage request)
    {
        if (odataPath.EdmType == null)
            return null;
        var path = odataPath.Segments.OfType<EntitySetPathSegment>().SingleOrDefault();
        if (path == null)
        {
            return null;
        }
        return path.EntitySetName + "V4";
    }
}

并按原样使用:

config.MapODataServiceRoute(
            "odatav4",
            "odata/v4",
            builder.GetEdmModel(),
            new DefaultODataPathHandler(),
            routingConventions);

从这里,您可以浏览到odata/v3/MyEntity和odata/v4/MyEntity等。