2014-09-04 6 views
9

같은 프로젝트에서 odata v3 및 v4 API가 나란히 작동하도록하려면 어떻게해야합니까?webApi2 Odata v3 및 V4가 나란히 나란히

동일한 컨트롤러가 두 형식으로 데이터를 반환 할 수 있습니까? Odata 버전 당 하나의 동일한 컨트롤러 사본 2 부를 가져야합니까?

공식 WEBAPI 페이지에 나와있는 것이 가능하다고 생각됩니다.

"ASP.NET 웹 API는 프로토콜의 v3과 v4를 모두 지원하며 v3 끝점과 나란히 실행되는 v4 끝점을 가질 수도 있습니다." - www.asp.net에서 인용하십시오.

질문은 - 어떻게 할 수 있습니까? 모든 자습서?

+0

이 문제와 코드 중복에 대한 ASP.Net 문제에 대한 링크 만 게시 https://aspnetwebstack.codeplex.com/workitem/2184 – Marty

답변

0

OData 구현에 따라 약간 다릅니다. 나는 WCF는 OData-Version 헤더를 지원합니다 알고 : 클라이언트가 원하는 버전을 지정하는 데 사용할 수 있으며, WCF는 단지 1 엔드 포인트로 적절하게 역할을

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

있다.

WebAPI 반면에, 나는 잘 모르지만, 아마도 테스트 할 가치가 있습니다.

4

네, 두 세트의 컨트롤러가 필요합니다. V4는 역 호환성을 제공하지 않습니다. https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataVersioningSample/

이것은 당신을위한 적합한 솔루션은 다음과 같습니다

또한 버전에 대한 또 다른 예제가있다. OData V3의 첫 번째 버전 (~/api/v1 /)과 V4의 두 번째 버전 (~ api/v2 /)을 만듭니다. 더 나은 분리를 제공합니다.

+0

OData v3 라이브러리를 참조하는 프로젝트와 OData v4 라이브러리를 참조하는 프로젝트라는 두 개의 서로 다른 프로젝트가 필요합니다. . – Dejan

+0

아니요. 내가 게시 한 링크와 동일한 방식으로 단일 프로젝트를 만들었습니다. V3 및 V4 라이브러리에 대한 참조가 있습니다. 그것은 완벽하게 작동합니다. – maomao

+0

NuGet을 사용하고 있습니까? – Dejan

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 등을 검색 할 수 있습니다