2014-09-04 9 views
9

Wie kann ich odata v3 und v4 api Seite an Seite auf dem gleichen Projekt arbeiten lassen?webApi2 Odata v3 und V4 nebeneinander

Kann derselbe Controller Daten in beiden Formaten zurückgeben? Muss ich zwei Kopien desselben Controllers haben - einen pro Odata-Version?

Ich weiß, dass dies möglich sein sollte, weil die offizielle WEBAPI-Seite sagt, dass es für entworfen wurde.

"Die ASP.NET-Web-API unterstützt sowohl v3 als auch v4 des Protokolls. Sie können sogar einen v4-Endpunkt verwenden, der parallel zu einem v3-Endpunkt ausgeführt wird." - Zitat von www.asp.net

Frage ist - wie mache ich das? Irgendwelche Tutorials?

+0

Nur einen Link zu ASP.Net Problem zu diesem Problem und Code-Duplizierung https://aspnetwebstack.codeplex.com/workitem/2184 – Marty

Antwort

4

Ja, Sie brauchen zwei Controller. V4 bietet keine Abwärtskompatibilität.

Es gibt auch eine andere Probe für Versionierung: https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataVersioningSample/

Dies ist die richtige Lösung für Sie. Sie erstellen die erste Version (~/api/v1 /) für OData V3 und die zweite Version (~ api/v2 /) für V4. Es bietet eine bessere Trennung.

+0

Beachten Sie, dass Sie immer noch zwei verschiedene Projekte haben müssen: ein Verweis auf OData v3-Bibliotheken und ein Verweis auf OData v4-Bibliotheken, wie im 'ODataSxSSample' gezeigt . – Dejan

+0

Nein. Sie nicht. Ich habe ein einzelnes Projekt auf die gleiche Weise erstellt wie den Link, den ich gepostet habe. Ich habe Referenzen auf V3 und V4-Bibliotheken. Es funktioniert perfekt. – maomao

+0

Verwenden Sie NuGet? – Dejan

0

Um die Schritte zusammenzufassen, die ziemlich einfach sind, ohne ein Beispiel herunterladen zu müssen, nuget Microsoft.AspNet.WebApi.Odata für v3 und Microsoft.AspNet.OData für v4. Beginnend mit v3 und v4, die mit Standardkonventionen verdrahtet sind, erhalten Sie einen doppelten Controller-Namen. Von hier aus ändern Sie das Standard-Routenpräfix v3 auf "odata/v3" (nicht erforderlich, aber empfohlen), und für v4 setzen Sie das Standard-Routenpräfix auf "odata/v4" und benennen Sie Ihren Controller in MyEntityV4Controller um. An diesem Punkt führt der Versuch, Routenattribute zur Lösung des Fehlers zu verwenden, zu einem http 406-Ergebnis. Erstellen Sie stattdessen eine Klasse:

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"; 
    } 
} 

Und es verwenden, wie so:

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

Von hier aus können Sie zu OData/v3/MyEntitys und OData/v4/MyEntitys durchsuchen usw.

Verwandte Themen