Префикс маршрутизации OData v4?

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

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

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


person Xorcist    schedule 07.04.2015    source источник
comment
В каком пространстве имен находится ODataRoute! Я не могу найти это   -  person JB's    schedule 16.08.2017
comment
ODataRoute раньше находился в пространстве имен System.Web.Http.OData.Routing, но он устарел. Это новый дом в пространстве имен System.Web.OData.Routing, которое вы можете получить как часть пакета Nuget Microsoft.AspNet.OData.   -  person Xorcist    schedule 25.08.2017


Ответы (1)


Вам нужно указать атрибут ODataRoute, даже если он пуст:

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

}
person Xorcist    schedule 07.04.2015