2012-01-16 26 views
8

Tôi hiện đang có một API web WCF mà tôi đã chia thành hai phiên bản. Phiên bản đầu tiên chạy tại api.mysite.com. Thứ hai hiện không được xuất bản cho sản xuất.Cách tốt nhất để phiên bản một API Web WCF là gì?

Tôi muốn có cách xuất bản API thứ hai sao cho các yêu cầu đối với phiên bản đầu tiên không bị gián đoạn. Ý tưởng của tôi là thêm tiêu đề x-api-version và định tuyến nội bộ yêu cầu tới API được chỉ định. Nếu không có tiêu đề, sau đó mặc lên phiên bản 1. Tôi coi thêm /v1 hoặc /v2 đến đầu của con đường để phân định các phiên bản như vậy mà một yêu cầu đến v1 hoặc v2 có thể trông giống như:

http://api.mysite.com/v1/authentication/login 
http://api.mysite.com/v2/auth/login 

Thông báo trước là các yêu cầu không có phiên bản phải hoạt động và mặc định cho phiên bản 1 (hoặc bất kỳ phiên bản nào tôi chỉ định).

Mặc dù điều này nghe có vẻ tốt (với tôi ít nhất), tôi không chắc chắn về cách thức được khuyến nghị thực hiện điều này. Tôi biết rằng tôi luôn có thể thực hiện một số loại proxy ngược lại nhưng tôi hy vọng rằng các giải pháp của tôi có thể là một giải pháp lập trình. Cấu hình ít được yêu cầu trên một phần của máy chủ, thì càng tốt. Nếu bất cứ ai có bất kỳ ý tưởng hoặc liên kết đến blog/hướng dẫn, đó sẽ là tuyệt vời!

Cảm ơn trước!

+0

Đây là cách google thực hiện ** v = 1.0 ** 'http: //ajax.googleapis.com/ajax/services/search/web? V = 1.0 & rsz = 8 & q = stackoverflow' –

+0

Tôi thấy 'tiêu đề phiên bản' và 'phiên bản URI' là phương pháp tương tự, và tôi sẽ hỗ trợ cả hai. Có nó trong URI là rất hữu ích cho các nhà phát triển - nó làm cho nó dễ dàng để thử nghiệm với các dịch vụ thông qua một trình duyệt. Tôi cũng sẽ hỗ trợ một 'URI không phiên bản' chuyển hướng sang phiên bản 'đang hoạt động' hiện tại (thường là phiên bản mới nhất, nhưng bạn có thể có các kịch bản nơi bạn đặt phiên bản mới nhưng không kích hoạt chúng công khai). Nó thực sự phụ thuộc vào tiêu chí của bạn. – Adam

+0

Sau khi xem chi tiết triển khai, tôi tin rằng tôi sẽ phải dựa nhiều hơn vào hướng tiếp cận URI một cách nghiêm ngặt do sự dễ dàng về kỹ thuật.Tuy nhiên, tôi tin rằng tôi có thể thực hiện phương pháp này trong khi vẫn đáp ứng yêu cầu ban đầu của tôi về việc không vi phạm các khách hàng của API hiện tại. –

Trả lời

1

Ok, tôi rất thích câu trả lời mà tôi đã nhận được cho đến nay (cảm ơn bạn cả hai), nhưng nó đã không hoàn toàn giải quyết vấn đề của tôi đưa ra những hạn chế và mục tiêu mà tôi có với API của mình. Vì vậy, tôi muốn trình bày chi tiết giải pháp mà tôi đã tìm thấy và dự định sử dụng.

Để bắt đầu, tôi đang phiên bản API của mình qua URI. Điều này là để có nghĩa là các phiên bản khác nhau của API sẽ trông giống như:

http://api.mysite.com/authentication/login 
http://api.mysite.com/v1/authentication/login 
http://api.mysite.com/v2/auth/login 
http://api.mysite.com/v3/auth/letmeinplease 
... you get the point ... 

Điều quan trọng cần lưu ý ở đây là nếu tôi không bao gồm một số phiên bản, sau đó tôi mặc lên phiên bản 1. Đây sẽ là hiện tại của tôi tuy nhiên, quá trình thiết lập có thể dễ dàng mặc định với phiên bản mới nhất, ổn định mới nhất, v.v.

Ở đây chúng tôi đi. Tôi đã tạo một thư mục mà ứng dụng sẽ sống (wwroot/api). Bên trong thư mục đó, tôi đã tạo các thư mục cho tất cả các phiên bản: v1, v2, v.v. Bây giờ, trong IIS (7.5 cho tôi), tôi đã tạo một dự án mới có gốc ứng dụng là wwroot/api/v1. Sau đó, tôi thêm vào mỗi thư mục phiên bản (bao gồm cả v1) như là một ứng dụng phụ. Điều này cho phép tôi phiên bản API thông qua URI (như đã thấy ở trên) tuy nhiên, có một báo trước.

Thừa kế Web.config thực sự có thể là một nỗi đau. Vì vậy, tôi đã chắc chắn để vô hiệu hóa nó cho tất cả các phiên bản api của tôi. Tài liệu tham khảo về cách thực hiện việc này có thể được tìm thấy here. Với ngoại lệ đó, mọi thứ hoạt động như một sự quyến rũ! :-)

5

Microsoft có một bài viết khá trên versioning với WCF here

+0

Đây là một bài viết tuyệt vời cho phiên bản. Tuy nhiên, tôi tin rằng nó không đáp ứng được các mục tiêu mà tôi có cho API của mình. Giống như tôi đã đề cập trong một bình luận cho câu trả lời của Erno, tôi muốn API trực quan. Tôi muốn tránh xa việc phiên bản các dịch vụ và/hoặc hợp đồng cụ thể theo bất kỳ cách nào hiển thị với khách hàng. Tôi muốn khách hàng chỉ nhìn thấy một phiên bản của API như một toàn thể –

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