কম্পিউটার টিউটোরিয়াল

C# ASP.NET WebAPI-তে কাস্টম মিডিয়া টাইপ দিয়ে ভার্সনিং কীভাবে করবেন?

মিডিয়া টাইপস একটি 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

C# ASP.NET WebAPI-তে কাস্টম মিডিয়া টাইপ দিয়ে ভার্সনিং কীভাবে করবেন?

আমাদের নিজস্ব 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 কন্ট্রোলার থেকে পাওয়া ফলাফল দেখাচ্ছে।

C# ASP.NET WebAPI-তে কাস্টম মিডিয়া টাইপ দিয়ে ভার্সনিং কীভাবে করবেন?

C# ASP.NET WebAPI-তে কাস্টম মিডিয়া টাইপ দিয়ে ভার্সনিং কীভাবে করবেন?

এখন যদি আমরা কাস্টম মিডিয়া টাইপ ব্যবহার করে একই আউটপুট 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 }
    );
}

C# ASP.NET WebAPI-তে কাস্টম মিডিয়া টাইপ দিয়ে ভার্সনিং কীভাবে করবেন?

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

  1. C# ASP.NET WebAPI-তে একশন মেথডের জন্য আলিয়াস নাম কীভাবে দিবেন?

  2. C# ASP.NET WebAPI-তে CORS সমস্যা সমাধান কীভাবে করবেন?

  3. C# ASP.NET WebAPI-তে একশন মেথড থেকে কাস্টম রেজাল্ট টাইপ রিটার্ন কীভাবে করবেন?

  4. জুম (Zoom) এ কাস্টম ব্যাকগ্রাউন্ড ব্যবহার করার পদ্ধতি