মিডিয়া টাইপস একটি API-কে ক্লায়েন্টকে জানাতে সক্ষম করে যে পেলোডের ডেটা কীভাবে ইন্টারপ্রেট করতে হবে। HTTP প্রোটোকলে, মিডিয়া টাইপস `text/html`, `application/json`, এবং `application/xml` এর মতো আইডেন্টিফায়ার দিয়ে নির্দিষ্ট করা হয়, যা যথাক্রমে HTML, JSON, এবং XML-র সাথে মিলে যায়—সবচেয়ে সাধারণ ওয়েব ফরম্যাট। অন্যান্য আরও API-নির্দিষ্ট মিডিয়া টাইপও রয়েছে, যেমন `application/vnd.api+json`।
নিচে মিডিয়া টাইপসে পাঠাতে হবে এমন ভার্সনগুলো দেওয়া হলো:
application/vnd.demo.students.v1+json StudentsV1Controller
application/vnd.demo.students.v2+json StudentsV2Controller

আমাদের নিজস্ব CustomControllerSelector যোগ করলে উপরের সমস্যা সমাধান হবে।
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;
}
}
}
WebApi.Config.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 }
);
}
}
StudentV1Controller
using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers
{
public class StudentV1Controller : ApiController
{
List students = new List
{
new StudentV1 { Id = 1, Name = "Mark" },
new StudentV1 { Id = 2, Name = "John" }
};
public IEnumerable Get()
{
return students;
}
public StudentV1 Get(int id)
{
var studentForId = students.FirstOrDefault(x => x.Id == id);
return studentForId;
}
}
}
StudentV2Controller
using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers
{
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()
{
return students;
}
public StudentV2 Get(int id)
{
var studentForId = students.FirstOrDefault(x => x.Id == id);
return studentForId;
}
}
}
নিচের আউটপুটগুলো কাস্টম মিডিয়া টাইপে ভার্সনিং ব্যবহার করে StudentV1 এবং StudentV2 কন্ট্রোলার থেকে পাওয়া ফলাফল দেখাচ্ছে।


এখন যদি আমরা কাস্টম মিডিয়া টাইপ ব্যবহার করে একই আউটপুট XML ফরম্যাটে পেতে চাই, তবে `WebApiConfig.cs`-এ নিচের কাস্টম মিডিয়া টাইপ যোগ করতে হবে:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Services.Replace(typeof(IHttpControllerSelector), new CustomControllerSelector(config));
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"));
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}

উপরের উদাহরণে আমরা দেখতে পাচ্ছি যে, কাস্টম মিডিয়া টাইপে নির্দিষ্ট অনুযায়ী আউটপুট XML ফরম্যাটে আসছে।