Media Type ใช้บอก Client ว่าควรตีความข้อมูลใน Payload อย่างไร ใน HTTP Protocol มี Media Types เช่น text/html, application/json, application/xml และ API-specific types เช่น application/vnd.api+json
ตัวอย่าง Media Type สำหรับ Versioning:
application/vnd.demo.students.v1+json → StudentsV1Controller application/vnd.demo.students.v2+json → StudentsV2Controller

ต้องสร้าง CustomControllerSelector เพื่อจัดการ Routing ตาม Media Type
ตัวอย่าง CustomControllerSelector
using System.Linq;
using System.Net.Http;
using System.Text.RegularExpressions;
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 = "";
string regex = @"application\/vnd\.demo\.([a-z]+)\.v(?[0-9]+)\+([a-z]+)";
var acceptHeader = request.Headers.Accept
.Where(a => Regex.IsMatch(a.MediaType, regex, RegexOptions.IgnoreCase));
if (acceptHeader.Any())
{
var match = Regex.Match(acceptHeader.First().MediaType, regex, RegexOptions.IgnoreCase);
versionNumber = match.Groups["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;
}
}
}
การลงทะเบียนใน WebApiConfig.cs
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 }
);
}
}
Controller สำหรับ Version 1 และ 2
// StudentV1Controller
public class StudentV1Controller : ApiController
{
List students = new List
{
new StudentV1 { Id = 1, Name = "Mark" },
new StudentV1 { Id = 2, Name = "John" }
};
public IEnumerable Get() => students;
public StudentV1 Get(int id) => students.FirstOrDefault(x => x.Id == id);
}
// StudentV2Controller
public class StudentV2Controller : ApiController
{
List students = new List
{
new StudentV2 { Id = 1, FirstName = "Roger", LastName = "Federer" },
new StudentV2 { Id = 2, FirstName = "Tom", LastName = "Bruce" }
};
public IEnumerable Get() => students;
public StudentV2 Get(int id) => students.FirstOrDefault(x => x.Id == id);
}
ผลลัพธ์จากการทดสอบ:


หากต้องการรองรับ XML Format ให้เพิ่ม Media Type ใน WebApiConfig:
config.Formatters.XmlFormatter.SupportedMediaTypes
.Add(new MediaTypeHeaderValue("application/vnd.demo.student.v1+xml"));
config.Formatters.XmlFormatter.SupportedMediaTypes
.Add(new MediaTypeHeaderValue("application/vnd.demo.student.v2+xml"));
