Tôi có Tuyến đường mặc định trong Global.asax:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Tôi muốn có thể nhắm mục tiêu một chức năng cụ thể, vì vậy tôi đã tạo một tuyến đường khác:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Vì vậy, trong bộ điều khiển của tôi, tôi có:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
Gọi điện .../api/records/bycategoryid/5
sẽ cho tôi những gì tôi muốn. Tuy nhiên, gọi điện .../api/records/1
sẽ báo lỗi cho tôi
Đã tìm thấy nhiều hành động phù hợp với yêu cầu: ...
Tôi hiểu lý do tại sao lại như vậy - các tuyến chỉ xác định URL nào là hợp lệ, nhưng khi nói đến khớp chức năng, cả hai Get(int id)
và ByCategoryId(int id)
đối sánh api/{controller}/{id}
, đó là điều gây nhầm lẫn cho khung.
Tôi cần làm gì để tuyến API mặc định hoạt động trở lại và giữ nguyên tuyến {action}
? Tôi đã nghĩ đến việc tạo một bộ điều khiển khác có tên RecordByCategoryIdController
để phù hợp với tuyến API mặc định, mà tôi sẽ yêu cầu .../api/recordbycategoryid/5
. Tuy nhiên, tôi thấy rằng đó là một giải pháp "bẩn" (do đó không đạt yêu cầu). Tôi đã tìm kiếm câu trả lời về vấn đề này và không có hướng dẫn nào về cách sử dụng tuyến đường {action}
thậm chí còn đề cập đến vấn đề này.