Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีทำ Versioning ด้วย Custom Media Type ใน C# ASP.NET WebAPI

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

วิธีทำ Versioning ด้วย Custom Media Type ใน C# ASP.NET WebAPI

ต้องสร้าง 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);
}

ผลลัพธ์จากการทดสอบ:

วิธีทำ Versioning ด้วย Custom Media Type ใน C# ASP.NET WebAPI

วิธีทำ Versioning ด้วย Custom Media Type ใน C# ASP.NET WebAPI

หากต้องการรองรับ 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"));

วิธีทำ Versioning ด้วย Custom Media Type ใน C# ASP.NET WebAPI