OData v4路由前缀?

问题描述 投票:9回答:1

我有一个并排的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。

如何使用不同的前缀但使用相同的名称来路由这些前缀,并将它们转到相应的控制器。如果我可以阻止它,我不希望每条路线都有不同的名称,前缀应该照顾一切,但由于某种原因它们不是。

c# asp.net-web-api odata asp.net-web-api-routing odata-v4
1个回答
13
投票

哇我觉得有点傻。发布后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
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.