Computer >> Máy Tính >  >> Lập trình >> C#

Làm cách nào để tạo phiên bản với tham số Chuỗi truy vấn trong C # ASP.NET WebAPI?

DefaultHttpControllerSelector lớp trong api web chịu trách nhiệm chọn phương thức hành động bộ điều khiển thích hợp mà chúng tôi gửi trong URI.

Giả sử chúng ta phải triển khai lập phiên bản trong chuỗi truy vấn như bên dưới

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

Nếu chúng tôi chuyển thông tin lập phiên bản trong chuỗi truy vấn nhưhttps:// localhost:58174 / api / student? V =1 sẽ dẫn đến phản hồi lỗi 404 Not Found vì phương thức SelectController () có trongDefaultHttpControllerSelector sẽ tìm kiếm StudentsController nhưng chúng tôi có onlyStudentsV1Controller và StudentsV2Controller.

Làm cách nào để tạo phiên bản với tham số Chuỗi truy vấn trong C # ASP.NET WebAPI?

Để xử lý trường hợp này, chúng ta nên thêm CustomControllerSelector của riêng mình triển khai lớp DefaultHttpControllerSelector.

CustomControllerSelector -

Ví dụ

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

Điều tiếp theo là chúng ta cần thay thế bộ chọn bộ điều khiển mặc định bằng bộ chọn bộ điều khiển tùy chỉnh của chúng tôi. Điều này được thực hiện trong tệp WebApiConfig.cs. Lưu ý rằng chúng tôi đang thay thế IHttpControllerSelector, bằng CustomControllerSelector.DefaultHttpControllerSelector của chúng tôi triển khai IHttpControllerSelector, do đó chúng tôi sẽ thay thế IHttpControllerSelector.

Ví dụ

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

StudenV1Controller -

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

Đầu ra

Các kết quả đầu ra bên dưới hiển thị kết quả mà chúng tôi nhận được từ Bộ điều khiển StudentV1 và StudentV2 với lập phiên bản trong chuỗi truy vấn.

Làm cách nào để tạo phiên bản với tham số Chuỗi truy vấn trong C # ASP.NET WebAPI?