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

จะทำการกำหนดเวอร์ชันด้วยพารามิเตอร์ Querystring ใน C # ASP.NET WebAPI ได้อย่างไร


DefaultHttpControllerSelector class ใน web api มีหน้าที่เลือกวิธีการดำเนินการควบคุมที่เหมาะสมที่เราส่งใน URI

สมมติว่าเราต้องใช้การกำหนดเวอร์ชันในสตริงการสืบค้นดังด้านล่าง

v=1 StudentsV1Controller (เวอร์ชัน 1)v=2 StudentsV2Controller (เวอร์ชัน 2)

หากเราส่งข้อมูลการกำหนดเวอร์ชันในสตริงการสืบค้น เช่นhttps://localhost:58174/api/student?v=1 จะส่งผลให้มีข้อผิดพลาด 404 Not Found เนื่องจากเมธอด SelectController() ซึ่งมีอยู่ในDefaultHttpControllerSelector จะค้นหา StudentsController แต่เรามี onlyStudentsV1Controller and StudentsV2Controller.

จะทำการกำหนดเวอร์ชันด้วยพารามิเตอร์ Querystring ใน C # ASP.NET WebAPI ได้อย่างไร

ในการจัดการกรณีนี้ เราควรเพิ่ม CustomControllerSelector . ของเราเอง ซึ่งใช้คลาส DefaultHttpControllerSelector

CustomControllerSelector

ตัวอย่าง

ใช้ System.Net.Http;ใช้ System.Web;ใช้ System.Web.Http;ใช้ System.Web.Http.Controllers;โดยใช้ System.Web.Http.Dispatcher;namespace WebAPI.Custom{ คลาสสาธารณะ CustomControllerSelector:DefaultHttpControllerSelector { HttpConfiguration ส่วนตัว _config; CustomControllerSelector สาธารณะ (การกำหนดค่า HTTPConfiguration) :ฐาน (config) { _config =config; } แทนที่สาธารณะ HttpControllerDescriptor SelectController (คำขอ HttpRequestMessage) { ตัวควบคุม var =GetControllerMapping (); var routeData =คำขอ GetRouteData (); var controllerName =routeData.Values["controller"].ToString(); ตัวควบคุม var =routeData.Values["controller"].ToString(); สตริง versionNumber ="1"; var versionQueryString =HttpUtility.ParseQueryString (request.RequestUri.Query); ถ้า (versionQueryString["v"] !=null) { versionNumber =versionQueryString["v"]; } if (versionNumber =="1"){ controllerName =controllerName + "V1"; } else if (versionNumber =="2"){ controllerName =controllerName + "V2"; } HttpControllerDescriptor controllerDescriptor; ถ้า (controllers.TryGetValue (controllerName, out controllerDescriptor)) { return controllerDescriptor; } คืนค่า null; } }}

สิ่งต่อไปที่เราจำเป็นต้องเปลี่ยนตัวเลือกตัวควบคุมเริ่มต้นด้วยตัวเลือกตัวควบคุมแบบกำหนดเองของเรา สิ่งนี้ทำในไฟล์ WebApiConfig.cs ขอให้สังเกตว่าเรากำลังแทนที่ IHttpControllerSelector ด้วย CustomControllerSelector.DefaultHttpControllerSelector ของเราใช้ IHttpControllerSelector ดังนั้นเราจึงกำลังแทนที่ IHttpControllerSelector

ตัวอย่าง

<ก่อนหน้า> WebApiConfig คลาสสแตติกสาธารณะ{ การลงทะเบียนโมฆะสแตติกสาธารณะ (การกำหนดค่า HttpConfiguration) { config.Services.Replace (typeof (IHttpControllerSelector), CustomControllerSelector ใหม่ (config)); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute ( ชื่อ:"DefaultApi", routeTemplate:"api/{controller}/{id}", ค่าเริ่มต้น:new { id =RouteParameter.Optional } ); }}

StudenV1Controller

ใช้ DemoWebApplication.Models; ใช้ System.Collections.Generic; ใช้ System.Linq; ใช้ System.Web.Http;namespace DemoWebApplication.Controllers{ StudentV1Controller ระดับสาธารณะ :ApiController{ รายการ  นักเรียน =รายการใหม่ { ใหม่ StudentV1{ Id =1, Name ="Mark" }, StudentV1 ใหม่{ Id =2, Name ="John" } }; IEnumerable สาธารณะ Get(){ ส่งคืนนักเรียน; } รับ StudentV1 สาธารณะ (int id) { var studentForId =students.FirstOrDefault(x => x.Id ==id); ส่งคืนนักเรียนForId; } }}

StudentV2Controller

ใช้ DemoWebApplication.Models; ใช้ System.Collections.Generic; ใช้ System.Linq; ใช้ System.Web.Http;namespace DemoWebApplication.Controllers { StudentV2Controller ระดับสาธารณะ :ApiController{ รายการ  นักเรียน =รายการใหม่ { ใหม่ StudentV2{ Id =1, FirstName ="Roger", LastName ="Federer" }, StudentV2 ใหม่{ Id =2, FirstName ="Tom", LastName ="Bruce" } }; IEnumerable สาธารณะ Get(){ ส่งคืนนักเรียน; } รับ StudentV2 สาธารณะ (int id) { var studentForId =students.FirstOrDefault(x => x.Id ==id); ส่งคืนนักเรียนForId; } } }

ผลลัพธ์

ผลลัพธ์ด้านล่างแสดงผลลัพธ์ที่เราได้รับจากตัวควบคุม StudentV1 และ StudentV2 พร้อมการกำหนดเวอร์ชันในสตริงการสืบค้น

จะทำการกำหนดเวอร์ชันด้วยพารามิเตอร์ Querystring ใน C # ASP.NET WebAPI ได้อย่างไร