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

วิธีทำ Versioning ด้วย Query String Parameter ใน C# ASP.NET WebAPI

Class DefaultHttpControllerSelector รับผิดชอบเลือก Controller ที่เหมาะสมจาก URI หากส่ง Version ผ่าน Query String เช่น https://localhost:58174/api/student?v=1 จะเกิด Error 404 เพราะ Selector หา StudentsController ไม่เจอ (มีแค่ StudentsV1Controller และ StudentsV2Controller)

วิธีทำ Versioning ด้วย Query String Parameter ใน C# ASP.NET WebAPI

แก้ไขโดยสร้าง CustomControllerSelector

ตัวอย่าง CustomControllerSelector

using System.Net.Http;
using System.Web;
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 = "1";

            var versionQueryString = HttpUtility.ParseQueryString(request.RequestUri.Query);
            if (versionQueryString["v"] != null)
            {
                versionNumber = versionQueryString["v"];
            }

            if (versionNumber == "1")
            {
                controllerName = controllerName + "V1";
            }
            else if (versionNumber == "2")
            {
                controllerName = controllerName + "V2";
            }

            HttpControllerDescriptor controllerDescriptor;
            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 ตัวอย่าง

// 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 ด้วย Query String Parameter ใน C# ASP.NET WebAPI