如何让odata v3和v4 api在同一个项目上并排工作?
同一个控制器可以返回两种格式的数据吗? 我是否需要拥有同一个控制器的2个副本 - 每个Odata版本一个?
我知道这应该是可能的,因为官方的WEBAPI页面说的是它的设计目的。
" ASP.NET Web API支持协议的v3和v4。您甚至可以拥有一个与v3端点并排运行的v4端点。" - 引自www.asp.net
问题是 - 我该怎么做?任何教程?
答案 0 :(得分:4)
这是一个并排的示例:https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataSxSSample/,FYI。此示例包含同一控制器的2个副本。
答案 1 :(得分:4)
是的,你确实需要两套控制器。 V4不提供向后兼容性。
还有另一个版本控制示例: https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataVersioningSample/
这是适合您的解决方案。您为OData V3创建了第一个版本(〜/ api / v1 /),为V4创建了第二个版本(~api / v2 /)。它提供了更好的分离。
答案 2 :(得分:0)
这取决于OData实现。我知道WCF支持OData-Version
标题:
客户端可以使用它来指定它想要的版本,WCF将仅使用1个端点进行适当的操作。
另一方面,WebAPI,我不知道,但它可能值得测试。答案 3 :(得分:0)
总结一些非常简单而无需下载示例的步骤,为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 / MyEntitys和odata / v4 / MyEntitys等。