ฉันมีเส้นทางเริ่มต้นใน Global.asax:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
ฉันต้องการกำหนดเป้าหมายฟังก์ชันเฉพาะดังนั้นฉันจึงสร้างเส้นทางอื่น:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
ดังนั้นในคอนโทรลเลอร์ของฉันฉันมี:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
การโทร.../api/records/bycategoryid/5
จะให้สิ่งที่ฉันต้องการ อย่างไรก็ตามการโทร.../api/records/1
จะทำให้ฉันมีข้อผิดพลาด
พบการดำเนินการหลายรายการที่ตรงกับคำขอ: ...
ฉันเข้าใจว่าเหตุใดจึงเป็นเช่นนั้น - เส้นทางเพียงแค่กำหนด URL ที่ถูกต้อง แต่เมื่อพูดถึงการจับคู่ฟังก์ชันทั้งGet(int id)
และByCategoryId(int id)
จับคู่api/{controller}/{id}
ซึ่งเป็นสิ่งที่ทำให้กรอบงานสับสน
ฉันจะทำอะไรต้องทำเพื่อให้ได้เส้นทางเริ่มต้น API เพื่อการทำงานอีกครั้งและให้เป็นหนึ่งเดียวกับ{action}
? ผมคิดว่าการสร้างตัวควบคุมที่แตกต่างกันตั้งชื่อRecordByCategoryIdController
ให้ตรงกับเส้นทางเริ่มต้นของ API .../api/recordbycategoryid/5
ซึ่งผมจะขอ อย่างไรก็ตามฉันพบว่าเป็นวิธีแก้ปัญหา "สกปรก" (จึงไม่น่าพอใจ) ฉันได้ค้นหาคำตอบเกี่ยวกับเรื่องนี้และไม่มีบทแนะนำเกี่ยวกับการใช้เส้นทางที่{action}
พูดถึงปัญหานี้เลย