9

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) にアクセスしようとすると、ODataController ではなく APIController にアクセスしてしまいます。

異なるプレフィックスを使用してこれらをルーティングする方法はありますが、同じ名前で、適切なコントローラーに移動させるにはどうすればよいですか? できればルートごとに異なる名前を付けたくありません。プレフィックスはすべてを処理する必要がありますが、何らかの理由でそうではありません。

4

1 に答える 1

15

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
  }

}
于 2015-04-07T19:34:24.593 に答える