2015-04-07 23 views
7

Mam side-by-side Web API 2.2 APIController i OData v4 ODataController. Moja APIController wykorzystuje routing przypisuje wewnętrznie tak (nie ma predefiniowane ustawienia domyślne routing):Prefiks trasowania 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 
    } 
    } 

i jako takie są kierowane do przez ./api/My i ./api/My/?mykey=value

a próbowałem skonfigurowaniu ODataController podążać podobną garnitur:

[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 
    } 
    } 

definiowania OData trasę z wyprzedzeniem tak:

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

ale próby uzyskania dostępu ./odata/My i ./odata/My(value) kończą przechodzenie do mojego kontrolera APIController zamiast ODataController.

W jaki sposób mogę je skierować za pomocą różnych prefiksów, ale o tej samej nazwie i przekazać je odpowiednim kontrolerom. Nie chcę mieć innej nazwy dla każdej trasy, jeśli mogę temu zapobiec, prefiksy powinny zająć się wszystkim, ale z jakiegoś powodu nie są.

+0

W jakich nazw 'ODataRoute' znaleziono! Nie mogę go znaleźć –

+0

OdataRoute był w System.Web.Http.OData.Routing, ale został przestarzały. Nowy dom znajduje się w przestrzeni nazw System.Web.OData.Routing, którą można pobrać jako część pakietu nuget Microsoft.AspNet.OData. – Xorcist

Odpowiedz

7

Wow Czuję się trochę głupio. 20min po wysłaniu go rozwiązuję. Krótkie i proste, musiałem rzeczywiście określić atrybut ODataRoute, nawet jeśli jest pusty, więc mój nowy ODataController, który działa, wygląda następująco:

[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 
    } 

}