2012-10-18 38 views
8

Tôi đang xây dựng api bằng cách sử dụng WebAPI. Những gì tôi đang chụp cho là tạo ra một thư viện bên ngoài mỗi phiên bản của API mà ứng dụng WebAPI sẽ truy vấn khi đăng ký các tuyến đường của nó trong WebApiConfigCác tuyến đường WebApi có cùng tuyến đườngTệp với giới hạn phiên bản

Ví dụ:Api.v1Api.v2


Họ sẽ chia sẻ tương tự chức năng nhưng dựa trên version được chuyển vào tiêu đề, nó sẽ chọn phiên bản API thích hợp:

/{controller}/{action} - HTTP-HEADER: version=1 maps to Api.v1.Controller/Action

/{controller}/{action}-HTTP-HEADER: version=2 bản đồ để Api.v2.Controller/Action


Mục đích là để tránh tiền tố /{ver}/{controller}/{action}. Tôi biết rằng có routeTemplates với cùng một giá trị không được hỗ trợ, nhưng tôi nghĩ tôi có thể liên kết các tuyến đường đến một không gian tên cụ thể và một hạn chế có thể giúp giải quyết được lần xuất hiện:

namespace Api.v1 
{ 
    public static class Routing 
    { 
     public static void MapRoutes(HttpConfiguration config) 
     { 
      IHttpRoute r = config.Routes.MapHttpRoute(
       name: "", 
       routeTemplate: "{controller}/{action}/{id}", 
       defaults: new 
       { 
        id = RouteParameter.Optional, 
        namespaces = new string[] { "Api.v1.Controllers" } 
       }, 
       constraints: new VersionConstraint(2) 
      ); 
     } 
    } 
} 

public class VersionConstraint : IRouteConstraint 
{ 
    int _version; 
    public VersionConstraint(int version) 
    { 
     _version = version; 
    } 

    public bool Match(
     HttpContextBase httpContext, 
     Route route, 
     string parameterName, 
     RouteValueDictionary values, 
     RouteDirection routeDirection) 
    { 
     int version; 
     int.TryParse(httpContext.Request.Headers["version"], out version); 
     return version == _version; 
    } 
} 

Cố gắng tiêm namespaces cho mỗi tuyến đường cũng không thực sự hữu ích. Thuộc tính DataTokens không có giá trị và chỉ đọc.


Bất kỳ ý tưởng nào về cách làm những gì tôi đang làm? Bất kỳ cách nào để có cùng một bản đồ tuyến đường đến các bộ điều khiển khác nhau cùng tên nhưng với chức năng và không gian tên khác nhau?

Trả lời

8

Hãy xem Versioning ASP.NET Web API Services Using HTTP Headers, điều này dường như trả lời câu hỏi của bạn về cách định tuyến dựa trên phần đầu của tiêu đề HTTP.

Bạn thay thế bộ chọn bộ điều khiển mặc định bằng tùy chỉnh IHttpControllerSelector để chọn bộ điều khiển chính xác dựa trên tiêu đề HTTP.

+0

nhờ, đọc bài viết này ngay meo – hunter

+0

cũng ... Tôi đã không biết tại sao điều này đã không xuất hiện trong tìm kiếm của tôi, đó chính xác là những gì tôi đang tìm kiếm. – hunter

+1

bằng cách sử dụng định tuyến thuộc tính mới trong API Web v2, bạn cũng có thể sử dụng định tuyến dựa trên URL, chỉ giới thiệu phiên bản trong thuộc tính RoutePrefix (cho toàn bộ bộ điều khiển) hoặc ở cấp độ hành động sử dụng thuộc tính Route – mare

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