2012-12-21 47 views
9

Tôi có ứng dụng ASP.NET MVC 4. Tôi muốn sử dụng tính năng Web API mới cho mục đích học tập. Tôi muốn tìm hiểu cách phơi bày cùng một điểm cuối, nhưng cung cấp các phiên bản khác nhau của nó. Nói cách khác, tôi muốn hiển thị các điểm cuối như sau:Hành động API Web phiên bản trong ASP.NET MVC 4

http://mysite/1.0/Products/1 
http://mysite/2.0/Products/1 

Để thực hiện điều này, tôi đã thêm thư mục "Api" trong thư mục "Bộ điều khiển" mặc định. Trong thư mục "Api", tôi có hai thư mục khác: "Version1-0" và "Version2-0". Mỗi thư mục có một ApiController tên là "ProductsController".

tôi đã cố gắng để lộ thiết bị đầu cuối bằng cách thêm định nghĩa đường sau trong tập tin WebApiConfig.cs tôi:

config.Routes.MapHttpRoute(
    name: "1-0Api", 
    routeTemplate: "api/1.0/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Thật không may, tôi không thể tìm ra cách để vạch trần những hành động thông qua URL tôi liệt kê ở trên. Tôi đang làm gì sai? Cảm ơn bạn!

Trả lời

7

Có thể bạn đang gặp sự cố vì bộ điều khiển có cùng tên. Không gian tên bộ điều khiển hoặc thư mục không quan trọng đối với WebAPI, chỉ có tên. Điều đơn giản nhất tôi có thể nghĩ là để đổi tên điều khiển ProductsV1Controller và ProductsV2Controller của bạn và thiết lập hai tuyến đường để trỏ đến các bộ điều khiển của bạn:

config.Routes.MapHttpRoute(
    name: "1-0Api", 
    routeTemplate: "api/1.0/Products/{id}", 
    defaults: new { controller = "ProductsV1", id = RouteParameter.Optional } 
); 
config.Routes.MapHttpRoute(
    name: "2-0Api", 
    routeTemplate: "api/2.0/Products/{id}", 
    defaults: new { controller = "ProductsV2", id = RouteParameter.Optional } 
); 

Tất nhiên, điều này trở nên lộn xộn nếu bạn có nhiều điều khiển bạn muốn để lộ trong này đường. Hãy để tôi xem nếu tôi không thể nghĩ ra điều gì tốt hơn cho bạn.

+0

Hiện tại, tôi chỉ có 1 bộ điều khiển (ProductsV1Controller) và tôi không thể truy cập điểm cuối đó. Tôi đang làm gì sai? Không có thay đổi nào khác đối với dự án. Tôi đã bắt đầu một dự án ASP.NET MVC 4 mới và muốn thêm một bộ điều khiển được phiên bản. –

+0

Một số điều có thể sai. Bộ điều khiển của bạn có thể không phải là một lớp công khai, bộ điều khiển có thể không lấy được từ ApiController, hoặc một cái gì đó khác. Phản hồi bạn nhận được từ máy chủ trên máy cục bộ là gì? –

+0

Bộ điều khiển của tôi là một lớp công khai. Bộ điều khiển có nguồn gốc từ ApiContoller. Trên máy địa phương của tôi, tôi nhận được một 404. Đó là điều kỳ lạ nhất. –

1

Bất kỳ cơ hội nào bạn vẫn có định tuyến API Web mặc định được xác định và nó là trước tuyến đường tùy chỉnh của bạn? Điều đó sẽ khiến kịch bản của bạn thất bại. Các định nghĩa tuyến đường sau đây (lưu ý thứ tự) đã làm việc cho tôi.

public static void Register(HttpConfiguration config) { 
    config.Routes.MapHttpRoute(
     name: "1-0Api", 
     routeTemplate: "api/1.0/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 
} 
5

Sebastiaan Dammann đã, trên blog của mình, đã mô tả cách ông đã làm API phiên bản Web bằng cách viết thực hiện của riêng mình IHttpControllerSelector và hỗ trợ giao diện.

http://damsteen.nl/blog/implementing-versioning-in-asp.net-web-api

Ông cũng đặt mã trên github

https://github.com/Sebazzz/SDammann.WebApi.Versioning

Và đóng gói nó trong NuGet cho chúng tôi! :)

https://nuget.org/packages/SDammann.WebApi.Versioning

Trong khi thực hiện IHttpControllerSelector chắc chắn là (IMHO) các Way Right để làm API phiên bản Web, Tôi nghĩ rằng nó sẽ là lý tưởng nếu ông bao gồm khả năng phiên bản dựa trên HTTP Accept tiêu đề (xem http://barelyenough.org/blog/2008/05/versioning-rest-web-services/).

Rất tiếc, phía khách hàng của tôi không thể làm việc với tiêu đề Accept, vì vậy, RouteVersionedControllerSelector của tôi là lý tưởng đối với tôi.

Edit: Không chắc thế nào tôi bị mất nó, nhưng có thực sự là một AcceptHeaderVersionedControllerSelector có thể được sử dụng để làm versioning các lý tưởng cách.Tôi hiện đang sử dụng nó trên một dự án mới, nhưng nó vẫn có some drawbacks

0

Nếu chúng ta tiếp cận 1st của bạn sau đó nó giúp cho tuyến đường và cho phép chúng tôi lấy dữ liệu cho V1, V2 .... nhưng bây giờ chúng tôi đã lấy một ví dụ về v1 và v2 cho một bộ điều khiển để mã định tuyến sẽ như sau:

config.Routes.MapHttpRoute(
    name: "1-0Api", 
    routeTemplate: "tables/v1/Products", 
    defaults: new { controller = "ProductsV1", id = RouteParameter.Optional } 
); 
config.Routes.MapHttpRoute(
    name: "2-0Api", 
    routeTemplate: "tables/v2/Products", 
    defaults: new { controller = "ProductsV2", id = RouteParameter.Optional } 
); 

Nhưng chúng tôi có hơn 20 bộ điều khiển và nhiều phiên bản sau đó làm thế nào để làm cho nó chung chung.

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