Tiêu đề Chấp nhận cho máy chủ biết trình duyệt muốn dữ liệu ở định dạng tệp nào. Các định dạng tệp này thường được gọi là kiểu MIME. MIME là viết tắt của Phần mở rộng Thư Internet Đa năng.
Phiên bản có thể được gửi trong Tiêu đề như bên dưới.
Version=1 StudentsV1Controller Version=2 StudentsV2Controller
Vì chúng tôi chưa xử lý phiên bản trong chấp nhận tiêu đề, chúng tôi nhận được lỗi 404 not found vì chúng tôi chỉ có bộ điều khiển StudentV1 và StudentV2. Hãy để chúng tôi thêm CustomControllerSelector của riêng mình triển khai lớp DefaultHttpControllerSelector.
CustomControllerSelector -
Ví dụ
using System.Linq; using System.Net.Http; using System.Web.Http; using System.Web.Http.Controllers; using System.Web.Http.Dispatcher; namespace WebAPI.Custom{ public class CustomControllerSelector : DefaultHttpControllerSelector{ private HttpConfiguration _config; public CustomControllerSelector(HttpConfiguration config) : base(config){ _config = config; } public override HttpControllerDescriptor SelectController(HttpRequestMessage request){ var controllers = GetControllerMapping(); var routeData = request.GetRouteData(); var controllerName = routeData.Values["controller"].ToString(); string versionNumber = ""; var acceptHeader = request.Headers.Accept.Where(a => a.Parameters .Count(p => p.Name.ToLower() == "version") > 0); if (acceptHeader.Any()){ versionNumber = acceptHeader.First().Parameters .First(p => p.Name.ToLower() == "version").Value; } HttpControllerDescriptor controllerDescriptor; if (versionNumber == "1"){ controllerName = string.Concat(controllerName, "V1"); } else if (versionNumber == "2"){ controllerName = string.Concat(controllerName, "V2"); } if (controllers.TryGetValue(controllerName, out controllerDescriptor)){ return controllerDescriptor; } return null; } } }
Điều tiếp theo là chúng ta cần thay thế bộ chọn bộ điều khiển mặc định bằng bộ chọn bộ điều khiển tùy chỉnh của chúng tôi. Điều này được thực hiện trong tệp WebApiConfig.cs. Lưu ý rằng chúng tôi đang thay thế IHttpControllerSelector, bằng CustomControllerSelector.DefaultHttpControllerSelector của chúng tôi triển khai IHttpControllerSelector, do đó chúng tôi sẽ thay thế IHttpControllerSelector.
Ví dụ
public static class WebApiConfig{ public static void Register(HttpConfiguration config){ config.Services.Replace(typeof(IHttpControllerSelector), new CustomControllerSelector(config)); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
StudentV1Controller -
Ví dụ
using DemoWebApplication.Models; using System.Collections.Generic; using System.Linq; using System.Web.Http; namespace DemoWebApplication.Controllers{ public class StudentV1Controller : ApiController{ List<StudentV1> students = new List<StudentV1>{ new StudentV1{ Id = 1, Name = "Mark" }, new StudentV1{ Id = 2, Name = "John" } }; public IEnumerable<StudentV1> Get(){ return students; } public StudentV1 Get(int id){ var studentForId = students.FirstOrDefault(x => x.Id == id); return studentForId; } } }
StudentV2Controller -
Ví dụ
using DemoWebApplication.Models; using System.Collections.Generic; using System.Linq; using System.Web.Http; namespace DemoWebApplication.Controllers{ public class StudentV2Controller : ApiController{ List<StudentV2> students = new List<StudentV2>{ new StudentV2{ Id = 1, FirstName = "Roger", LastName = "Federer" }, new StudentV2{ Id = 2, FirstName = "Tom", LastName = "Bruce" } }; public IEnumerable<StudentV2> Get(){ return students; } public StudentV2 Get(int id){ var studentForId = students.FirstOrDefault(x => x.Id == id); return studentForId; } } }
Các kết quả đầu ra dưới đây cho thấy kết quả mà chúng tôi nhận được từ các Bộ điều khiển StudentV1 và StudentV2 với việc lập phiên bản trong các tiêu đề chấp nhận.