ฉันกำลังสร้าง API ที่มีตัวควบคุมที่มีการดำเนินการ GET เดียว:
[Route("api/xxxxx/{param1:int}/{param1:int}")]
public IHttpActionResult Get(int param1, int param2) {
// method body...
}
URL จะอยู่ในรูปแบบต่อไปนี้:
/api/xxxxx/1/1?p1=5&p2=hello&p3=20161108
/api/xxxxx/1/1?p1=active
หมายเลขและชื่อของพารามิเตอร์สตริงการสืบค้นจะแตกต่างกันไป
ฉันต้องการส่งพารามิเตอร์สตริงการสืบค้นไปยังวิธีการควบคุม แต่ฉันไม่สามารถฮาร์ดโค้ดลงในลายเซ็นวิธีการได้ เนื่องจากชื่อและตัวเลขที่แตกต่างกัน มีวิธีการทำเช่นนี้หรือไม่? ฉันได้ลองโทร var qsParams = ControllerContext.Request.GetQueryNameValuePairs();
แล้ว แต่ได้รับข้อผิดพลาดไม่พบทรัพยากรเมื่อพยายามขอ URL ใด ๆ ด้วยสตริงการสืบค้น โดยพิจารณาจากแอตทริบิวต์ Route
ที่แสดงด้านบน
ฉันพบทางเลือกหนึ่ง: ใช้ค่าเส้นทางแทนพารามิเตอร์สตริงการสืบค้น จากนั้นใช้ catch-all {*tags}
และส่งผ่านเป็นพารามิเตอร์เมธอด:
[Route("api/xxxxx/{param1:int}/{param1:int}/{*tags}")]
public IHttpActionResult Get(int param1, int param2, string tags) {
// method body...
}
ด้วย URL ในรูปแบบ
/api/xxxxx/1/1/5/john/20161108
/api/xxxxx/1/1/active
ใช้งานได้ แต่ฉันควรใช้สตริงการสืบค้นเพื่อให้สามารถใช้คีย์ที่มีชื่อแทนการพึ่งพาการเรียงลำดับของพารามิเตอร์ (นอกจากนี้ การใช้สตริงการสืบค้นดูเหมือนจะตรงกับแนวความคิดที่ดีกว่าสำหรับสิ่งที่ฉันทำอยู่)
ดังนั้น ฉันจะส่งพารามิเตอร์สตริงการสืบค้นตัวแปรไปยังการดำเนินการของคอนโทรลเลอร์ได้อย่างไร ฉันพูดว่า "ส่ง" พารามิเตอร์ แต่ไม่จำเป็นต้องส่งผ่านเป็นพารามิเตอร์ของวิธีการ ตราบใดที่ฉันสามารถเข้าถึงพารามิเตอร์สตริงการสืบค้นจากเนื้อหาของวิธีการ ในขณะที่รับ URL ที่มีสตริงการสืบค้นเพื่อแก้ไขเป็น การกระทำที่เป็นปัญหา
แก้ไข:
เป็นที่น่าสังเกตว่าการสร้างวิธีดำเนินการหลายวิธีสำหรับชุดพารามิเตอร์ทุกชุดที่เป็นไปได้นั้นไม่ใช่ตัวเลือก
แก้ไข 2:
ฉันเห็นวิธีแก้ปัญหาโดยตรงสองวิธี หากเป็นไปได้:
- ส่งผ่านสตริงการสืบค้นทั้งหมดไปยังวิธีการดำเนินการเป็นพารามิเตอร์สตริงเดียว ฉันสามารถแยกสตริงการสืบค้นด้วยตนเองได้
- สามารถใช้
ControllerContext.Request.GetQueryNameValuePairs()
ภายในเนื้อหาของเมธอดได้ โดยไม่ได้เพิ่มพารามิเตอร์ที่เกี่ยวข้องให้กับลายเซ็นของเมธอด
อย่างไรก็ตาม ฉันไม่รู้ว่าสองสิ่งนี้เป็นไปได้หรือไม่ แม้ว่าดูเหมือนว่าจะเป็นไปได้อย่างใดอย่างหนึ่งหรือทั้งสองอย่างก็ตาม