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 WebApiConfig
Cá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.v1
và Api.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?
nhờ, đọc bài viết này ngay meo – hunter
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
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