Accept Header সার্ভারকে বলে যে ব্রাউজার কোন ফাইল ফরম্যাটে ডেটা চায়। এই ফাইল ফরম্যাটগুলোকে সাধারণত MIME-টাইপ বলা হয়। MIME মানে Multipurpose Internet Mail Extensions।
ভার্সনিং হেডারসে নিচের মত করে পাঠানো যেতে পারে:
Version=1 StudentsV1Controller
Version=2 StudentsV2Controller

যেহেতু আমরা Accept Header-এ ভার্সন হ্যান্ডল করিনি, তাই 404 Not Found এরর আসছে কারণ আমাদের শুধু StudentV1 এবং StudentV2 কন্ট্রোলার আছে। চলুন CustomControllerSelector তৈরি করি যা DefaultHttpControllerSelector ক্লাস ইমপ্লিমেন্ট করবে।
CustomControllerSelector ইমপ্লিমেন্টেশন
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;
}
}
}
এরপর ডিফল্ট কন্ট্রোলার সিলেক্টরকে আমাদের কাস্টম কন্ট্রোলার সিলেক্টর দিয়ে রিপ্লেস করতে হবে। এটি `WebApiConfig.cs` ফাইলে করা হয়। লক্ষ্য করুন আমরা `IHttpControllerSelector`-কে আমাদের `CustomControllerSelector` দিয়ে রিপ্লেস করছি। `DefaultHttpControllerSelector` `IHttpControllerSelector` ইমপ্লিমেন্ট করে, তাই আমরা `IHttpControllerSelector`-কে রিপ্লেস করছি।
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 }
);
}
}
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;
}
}
}
নিচের আউটপুটগুলো Accept Header-এ ভার্সনিং ব্যবহার করে StudentV1 এবং StudentV2 কন্ট্রোলার থেকে পাওয়া ফলাফল দেখাচ্ছে।

