Computer >> 컴퓨터 >  >> 프로그램 작성 >> C#

C# ASP.NET WebAPI에서 Querystring 매개 변수로 버전 관리를 수행하는 방법은 무엇입니까?

<시간/>

DefaultHttpControllerSelector 웹 API의 클래스는 URI로 보내는 적절한 컨트롤러 작업 방법을 선택하는 역할을 합니다.

아래와 같이 쿼리 문자열에서 버전 관리를 구현해야 한다고 가정해 보겠습니다.

v=1 StudentsV1Controller (Version 1)
v=2 StudentsV2Controller (Version 2)

https://localhost:58174/api/student?v=1과 같은 쿼리 문자열에 버전 정보를 전달하면 DefaultHttpControllerSelector에 있는 SelectController() 메서드가 StudentsController를 찾을 것이기 때문에 404 Not Found 오류 응답이 발생합니다. onlyStudentsV1Controller 및 StudentsV2Controller.

C# ASP.NET WebAPI에서 Querystring 매개 변수로 버전 관리를 수행하는 방법은 무엇입니까?

이 경우를 처리하려면 자체 CustomControllerSelector를 추가해야 합니다. DefaultHttpControllerSelector 클래스를 구현합니다.

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 파일에서 수행됩니다. IHttpControllerSelector를 CustomControllerSelector로 교체하고 있습니다. DefaultHttpControllerSelector는 IHttpControllerSelector를 구현하므로 IHttpControllerSelector를 교체합니다.

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 }
      );
   }
}

StudenV1컨트롤러 -

using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
   public class StudentV1Controller : ApiController{
      List<StudentV1> students = new List<StudentV1>{
         new StudentV1{
            Id = 1,
            Name = "Mark"
         },
         new StudentV1{
            Id = 2,
            Name = "John"
         }
      };
      public IEnumerable<StudentV1> 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<StudentV2> students = new List<StudentV2>{
         new StudentV2{
            Id = 1,
            FirstName = "Roger",
            LastName = "Federer"
         },
         new StudentV2{
            Id = 2,
            FirstName = "Tom",
            LastName = "Bruce"
         }
      };
      public IEnumerable<StudentV2> Get(){
         return students;
      }
      public StudentV2 Get(int id){
         var studentForId = students.FirstOrDefault(x => x.Id == id);
         return studentForId;
      }
   }  
}

출력

아래 출력은 쿼리 문자열의 버전 관리를 통해 StudentV1 및 StudentV2 컨트롤러에서 얻은 결과를 보여줍니다.

C# ASP.NET WebAPI에서 Querystring 매개 변수로 버전 관리를 수행하는 방법은 무엇입니까?