Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Phiên bản hóa WebAPI với QueryString Parameter trong C# ASP.NET

Lớp DefaultHttpControllerSelector trong Web API chịu trách nhiệm chọn phương thức hành động controller phù hợp mà ta gửi trong URI.

Giả sử ta cần triển khai phiên bản hóa trong query string như sau:

v=1 → StudentsV1Controller (Phiên bản 1)
v=2 → StudentsV2Controller (Phiên bản 2)

Nếu truyền thông tin phiên bản trong query string như https://localhost:58174/api/student?v=1 sẽ dẫn đến lỗi 404 Not Found vì phương thức SelectController() trong DefaultHttpControllerSelector sẽ tìm StudentsController nhưng ta chỉ có StudentsV1Controller và StudentsV2Controller.

Phiên bản hóa WebAPI với QueryString Parameter trong C# ASP.NET

Để xử lý trường hợp này, ta nên thêm CustomControllerSelector triển khai từ DefaultHttpControllerSelector.

Triển khai 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;
        }
    }
}

Tiếp theo, thay thế default controller selector bằng custom controller selector trong WebApiConfig.cs.

Cấu hình 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;
        }
    }
}

Kết quả

Kết quả từ StudentV1 và StudentV2 controllers với phiên bản hóa trong query string:

Phiên bản hóa WebAPI với QueryString Parameter trong C# ASP.NET