2015-04-07 14 views
7

Dispongo di un APIController API 2.2 Web side-by-side e ODataV4 ODataController. Il mio APIController utilizza attributi di routing internamente come questo (non ci sono impostazioni predefinite di routing predefinite):Prefisso di routing OData v4?

[RoutePrefix("api")] 
    public class MyController : ApiController 
    { 
    [HttpGet] 
    [Route("My")] 
    public IHttpActionResult Get() 
    { 
     //Code Here 
    } 

    [HttpGet] 
    [Route("My")] 
    public IHttpActionResult Get([FromUri] String mykey) 
    { 
     //Code Here 
    } 
    } 

e come tali vengono indirizzate al attraverso ./api/My e ./api/My/?mykey=value

e ho provato ad installare il mio ODataController a seguire una tuta simile con:

[ODataRoutePrefix("My")] 
    public class oMyController : ODataController { 

    [HttpGet] 
    public IHttpActionResult Get(ODataQueryOptions<FileModel> queryOptions) { 
     //Code Here 
    } 

    [HttpGet] 
    [ODataRoute("({mykey})")] 
    public IHttpActionResult Get([FromODataUri] String mykey) { 
     //Code Here 
    } 
    } 

definendo percorso odata prima del tempo come questo:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
    builder.EntitySet<MyModel>("My"); 
    config.MapODataServiceRoute(
    routeName: "ODataRoute", 
    routePrefix: "odata", 
    model: builder.GetEdmModel() 
); 

ma tenta di accedere ./odata/My e ./odata/My(value) finiscono nel mio APIController invece di ODataController.

Come è possibile eseguire il routing utilizzando i diversi prefissi, ma lo stesso nome, e portarli ai controller appropriati. Non voglio avere un nome diverso per ogni percorso se posso impedirlo, i prefissi dovrebbero occuparsi di tutto, ma per qualche motivo non lo sono.

+0

In quello spazio dei nomi 'ODataRoute' è trovato! Non riesco a trovarlo –

+0

ODataRoute si trovava nello spazio dei nomi System.Web.Http.OData.Routing, ma è stato dichiarato obsoleto. La nuova casa è sotto lo spazio dei nomi System.Web.OData.Routing, che puoi ottenere come parte del pacchetto nuget Microsoft.AspNet.OData. – Xorcist

risposta

7

Wow, mi sento un po 'sciocco. 20 minuti dopo la pubblicazione lo risolvo. Breve e semplice, avevo bisogno di specificare in realtà l'attributo ODataRoute, anche se è vuoto, così il mio nuovo ODataController, che fa il lavoro, si presenta come segue:

[ODataRoutePrefix("My")] 
public class oMyController : ODataController { 

    [HttpGet] 
    [ODataRoute()] // <---<< This was the key to proper OData routing 
    public IHttpActionResult Get(ODataQueryOptions<FileModel> queryOptions) { 
    //Code Here 
    } 

    [HttpGet] 
    [ODataRoute("({mykey})")] 
    public IHttpActionResult Get([FromODataUri] String mykey) { 
    //Code Here 
    } 

}