7

У меня есть бок о бок Web API 2.2 APIController и OData v4 ODataController. Мой APIController использует маршрутизацию атрибуты внутренне, как это (нет предопределенных значений по умолчания маршрутизации):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 
    } 
    } 

и, как таковые, проложенных к через ./api/My и ./api/My/?mykey=value

и я попытался установить мой ODataController следовать подобный костюм с:

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

определение OData маршрут заранее, как это:

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

, но пытается получить доступ ./odata/My и ./odata/My(value), в конечном итоге входит в мой APIController вместо ODataController.

Как я могу направить их с помощью разных префиксов, но с тем же именем, и попросить их перейти к соответствующим контроллерам. Я не хочу иметь другое имя для каждого маршрута, если я могу его предотвратить, префиксы должны заботиться обо всем, но по какой-то причине это не так.

+0

В каком пространстве имен 'ODataRoute' найден! Я не могу найти его –

+0

ODataRoute раньше находился в пространстве имен System.Web.Http.OData.Routing, но это было устарело. Это новый дом находится под пространством имен System.Web.OData.Routing, которое вы можете получить как часть пакета Microsoft.AspNet.OData nuget. – Xorcist

ответ

7

Ничего себе, я чувствую себя немного глупо. 20 минут после публикации я решаю это. Короткий и простой, что мне нужно на самом деле указать атрибут ODataRoute, даже если он пустой, так что мой новый ODataController, который делает работу, выглядит следующим образом:

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

}