Dường như có một logic mặc định tích hợp cho Web API để sử dụng HTTP Verb làm tên hành động nếu không có hành động nào được cung cấp trong URL. Ví dụ, tôi có tuyến đường này:Làm cách nào để sửa đổi các tuyến API Web mặc định của khung công tác?
config.Routes.MapHttpRoute(
name: "DefaultApiController",
routeTemplate: "api/{controller}"
);
Và đây là hành động của tôi:
public IEnumerable<Conference> Get()
{
...
}
[ActionName("current")]
public IEnumerable<Conference> GetCurrent()
{
...
}
Khi tôi đi đến ~/Hội Nghị với một động từ GET, nó sẽ đưa bạn đến "Nhận()" hoạt động. Nếu sử dụng động từ POST, nó sẽ đưa bạn đến "Post ([FromBody] Conference value)" action ... và vv. Có một mâu thuẫn mặc dù khi bạn cố gắng để đi đến ~/Hội Nghị/GetCurrent (mặc dù tôi có [ActionName ("hiện tại")] trên đầu trang):
Nhiều hoạt động đã được tìm thấy phù hợp với yêu cầu: Hệ thống .Collections.Generic.IEnumerable
1[MyApp.Models.Conference] Get() on type MyApp.Api.ConferencesController System.Collections.Generic.IEnumerable
1 [MyApp.Models.Conference] GetCurrent() trên kiểu MyApp.Api.ConferencesController
Điều này có nghĩa khuôn khổ đang sử dụng StartsWith thay vì bình đẳng để xác định một hành động mặc định. Ngoài ra, nó bỏ qua thuộc tính ActionName khi kết hợp động từ với hành động.
Câu hỏi của tôi là làm cách nào để tôi thực hiện hành động mặc định của khung làm khớp chính xác với động từ, thay vì sử dụng logic StartsWith? Một động từ GET chỉ phù hợp với hành động Get(), chứ không phải Get(), GetCurrent() GetPast(), vv (đặc biệt khi nó bỏ qua thuộc tính ActionName).
EDIT Để đơn giản, tôi chỉ hiển thị một trong các tuyến đường ở trên. Tôi nghĩ rằng nó có thể giúp đỡ nếu tôi hiển thị tất cả các tuyến đường của tôi mà vẫn còn trong dự thảo. Tôi cố gắng để có được một API REST làm việc hoàn toàn trong khi vẫn để lại chỗ cho thêm hành động tùy chỉnh của riêng tôi:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApiControllerActionId",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: null,
constraints: new { action = @"^[a-zA-Z]+$", id = @"^\d+$" } // action must start with character
);
config.Routes.MapHttpRoute(
name: "DefaultApiControllerActionName",
routeTemplate: "api/{controller}/{action}/{name}",
defaults: null,
constraints: new { action = @"^[a-zA-Z]+$", name = @"^[a-zA-Z]+$" } // action and name must start with character
);
config.Routes.MapHttpRoute(
name: "DefaultApiControllerId",
routeTemplate: "api/{controller}/{id}",
defaults: null,
constraints: new { id = @"^\d+$" } // id must be all digits
);
config.Routes.MapHttpRoute(
name: "DefaultApiControllerAction",
routeTemplate: "api/{controller}/{action}",
defaults: null,
constraints: new { action = @"^[a-zA-Z]+$" } // action must start with character
);
config.Routes.MapHttpRoute(
name: "DefaultApiController",
routeTemplate: "api/{controller}"
);
CẬP NHẬT Dường như thêm contraints HTTP động từ giúp:
config.Routes.MapHttpRoute(
name: "DefaultApiControllerGet",
routeTemplate: "api/{controller}",
defaults: new { action = "Get" },
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);
config.Routes.MapHttpRoute(
name: "DefaultApiControllerPost",
routeTemplate: "api/{controller}",
defaults: new { action = "Post" },
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) }
);
config.Routes.MapHttpRoute(
name: "DefaultApiControllerPut",
routeTemplate: "api/{controller}",
defaults: new { action = "Put" },
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Put) }
);
config.Routes.MapHttpRoute(
name: "DefaultApiControllerDelete",
routeTemplate: "api/{controller}",
defaults: new { action = "Delete" },
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Delete) }
);
Đối với một API REST, tôi vẫn sẽ cần phải nhận được ~/Hội Nghị vẫn làm việc dù – Basem
chỉnh sửa: ok bây giờ mà bạn đăng tải tất cả các tuyến đường của bạn, hình ảnh rõ ràng hơn nhiều;) –
Bài viết tuyệt vời, thx! Ngoài ra AttributeRouting âm thanh hứa hẹn nhưng có vẻ như hiệu suất API Web và tính năng bộ nhớ đệm không được thừa hưởng. – Basem