2014-09-04 13 views
9

Come posso avere Odata v3 e v4 api che lavorano fianco a fianco sullo stesso progetto?webApi2 Odata v3 e V4 affiancati

Lo stesso controller può restituire dati in entrambi i formati? Devo avere 2 copie dello stesso controller - uno per versione Odata?

So che questo dovrebbe essere possibile causa la pagina ufficiale WebAPI dice che è stato progettato per.

"L'API Web ASP.NET supporta sia la versione v3 che la versione 4. Inoltre, è possibile utilizzare un endpoint v4 che viene eseguito parallelamente a un endpoint v3." - citazione da www.asp.net

domanda è - come posso fare questo? Qualche tutorial?

+0

Pubblicare semplicemente un collegamento al problema ASP.Net su questo problema e la duplicazione del codice https://aspnetwebstack.codeplex.com/workitem/2184 – Marty

risposta

4

Sì, è necessario disporre di due set di controller. V4 non fornisce la retrocompatibilità.

C'è anche un altro campione per il controllo delle versioni: https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataVersioningSample/

Questa è la soluzione giusta per voi. Si crea la prima versione (~/api/v1 /) per OData V3 e la seconda versione (~ api/v2 /) per V4. Fornisce una migliore separazione.

+0

Nota che hai ancora bisogno di avere due progetti distinti: un riferimento alle librerie OData v3 e un riferimento alle librerie OData v4 come mostrato nel 'ODataSxSSample' . – Dejan

+0

No. Non è così. Ho creato un singolo progetto seguendo le stesse modalità del link che ho postato. Ho riferimenti a entrambe le librerie V3 e V4. Funziona perfettamente. – maomao

+0

Stai usando NuGet? – Dejan

0

Per riepilogare i passaggi che sono abbastanza semplici senza dover scaricare un campione, nuget Microsoft.AspNet.WebApi.Odata per v3 e Microsoft.AspNet.OData per v4. A partire da v3 e v4 cablati con convenzioni predefinite, verrà trovato un nome controller duplicato. Da qui, modificare il prefisso del percorso predefinito v3 su "odata/v3" (non richiesto ma consigliato) e, per v4, impostare il prefisso del percorso predefinito su "odata/v4" e rinominare il controller su MyEntityV4Controller. A questo punto, il tentativo di utilizzare gli attributi di percorso per risolvere l'errore porterà a un risultato http 406. Invece, creare una classe:

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

e usarlo come modo:

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

Da qui sarete in grado di navigare a odata/v3/MyEntitys e odata/v4/MyEntitys, etc.

Problemi correlati