2015-04-07 21 views
7

Tôi có một bộ điều khiển API Web API 2.2 bên cạnh và ODataController OData v4. APIController của tôi sử dụng định tuyến thuộc tính nội bộ như thế này (không có giá trị mặc định định tuyến được xác định trước):Tiền tố định tuyến 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 
    } 
    } 

và như vậy được chuyển đến qua ./api/My và ./api/My/?mykey=value

và tôi đã cố gắng thiết lập ODataController của tôi để làm theo một bộ đồ tương tự với:

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

xác định tuyến đường OData trước thời hạn như thế này:

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

nhưng cố truy cập ./odata/My và ./odata/My(value) sẽ kết thúc vào APIController thay vì ODataController.

Làm cách nào tôi có thể định tuyến chúng bằng các tiền tố khác nhau, nhưng có cùng tên và đưa chúng đến các bộ điều khiển thích hợp. Tôi không muốn có một tên khác nhau cho mỗi tuyến đường nếu tôi có thể ngăn chặn nó, các tiền tố sẽ chăm sóc của tất cả mọi thứ, nhưng đối với một số lý do họ không.

+0

Trong không gian tên 'ODataRoute' được tìm thấy! Tôi không thể tìm thấy nó –

+0

ODataRoute được sử dụng để được trong không gian tên System.Web.Http.OData.Routing, nhưng điều đó đã không được chấp nhận. Đó là ngôi nhà mới nằm trong không gian tên System.Web.OData.Routing, mà bạn có thể nhận được như là một phần của gói Microsoft.AspNet.OData nuget. – Xorcist

Trả lời

7

Wow tôi cảm thấy một chút ngớ ngẩn. 20 phút sau khi đăng bài, tôi giải quyết nó. Ngắn và đơn giản, tôi cần phải chỉ định thuộc tính ODataRoute, ngay cả khi nó trống, vì vậy ODataController mới của tôi, hoạt động như sau:

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

} 
Các vấn đề liên quan