Giả sử bạn đang sử dụng các tuyến đường mặc định câu trả lời ngắn gọn là: phương pháp định nghĩa đầu tiên (ở phía trên) của lớp học của bạn sẽ được gọi. phương pháp khác là không thể tiếp cận.
LƯU Ý: phiên bản beta hoạt động như ở trên cho 'khớp nhiều phương thức' - phiên bản RC & Phiên bản phát hành có nhiều OCD hơn một chút. Nó ném một lỗi nếu có nhiều trận đấu tiềm năng. Thay đổi này loại bỏ sự nhầm lẫn của nhiều kết quả không rõ ràng. Đồng thời, nó làm giảm khả năng kết hợp các giao diện kiểu REST và RPC trong cùng một bộ điều khiển, dựa vào thứ tự chồng chéo &.
Trộm cắp tự do từ another post I wrote on the topic:
WebAPI Matching Semantic
Các phù hợp với ngữ nghĩa được sử dụng bởi WebAPI là khá đơn giản.
- Nó phù hợp với tên của hành động với động từ (verb = get? Tìm kiếm phương pháp bắt đầu bằng "nhận được")
- nếu một tham số được thông qua, các api tìm kiếm một hành động với một tham số
Vì vậy, trong mã của bạn, hãy lấy một yêu cầu GET mà không có tham số khớp với hàm Get*()
mà không có tham số. A chứa và ID tìm kiếm một Get***(int id)
.
Ví dụ
Trong khi ngữ nghĩa phù hợp rất đơn giản, nó tạo ra một số nhầm lẫn cho các nhà phát triển MVC (cũng ít nhất nhà phát triển này). Hãy xem xét một số ví dụ:
Tên vô danh - Phương thức nhận của bạn có thể được đặt tên bất cứ điều gì, miễn là bắt đầu bằng "get". Vì vậy, trong trường hợp của một bộ điều khiển widget, bạn có thể đặt tên cho các hàm của mình GetStrawberry()
và nó vẫn sẽ được khớp. Hãy suy nghĩ về kết hợp như một cái gì đó như: methodname.StartsWith("Get")
Nhiều phương pháp đối sánh - Điều gì sẽ xảy ra nếu bạn có hai phương pháp Nhận không có tham số?GetStrawberry()
và GetOrange()
. Tốt nhất tôi có thể nói, hàm được định nghĩa đầu tiên (đầu tệp) trong mã của bạn thắng ... lạ. Điều này có tác dụng phụ của việc làm cho một số phương pháp trong bộ điều khiển của bạn không thể truy cập (ít nhất là với các tuyến đường mặc định) .... người lạ.
CẬP NHẬT
@WinFXGuy - Đây là một chút thời gian để đặt trong một chú thích, nhưng ...
Đừng nhảy đến kết luận! Tôi đã cố trả lời câu hỏi mà bạn đặt ra, nhưng đó chỉ là một nửa câu chuyện. Có rất nhiều điều bạn có thể làm để thay đổi hành vi mặc định.
Đầu tiên, WebAPI hỗ trợ nhiều thông số oData. Nếu bạn bong bóng một IQueryable
lên đến bộ điều khiển của bạn, oData paramaters được tự động tích hợp với đối tượng truy vấn. Nó có các tham số như $filter
, $top
và $skip
. Vì vậy, bạn trong trường hợp của bạn, bạn có thể viết một phương pháp và vượt qua một cái gì đó như $filter=sale_date neq null
.
Ngoài ra, bạn có thể áp dụng thuộc tính [ResultLimit]
để ngăn mọi người yêu cầu 15 tỷ bản ghi.
Thứ hai bạn có thể sửa đổi các tuyến đường. Các tuyến mặc định hướng tới một api RESTful, nơi bạn thường có 1 bộ điều khiển cho mỗi thực thể. Bạn có thể thay đổi các tuyến đường và làm cho nó phong cách RPC.
Nếu bạn nhìn vào bài đăng được liên kết của tôi, tôi giải thích cách tôi giữ liên kết tuyến mặc định, thêm 'thư mục phụ' và cũng cho phép gọi phương thức bổ sung cho các tình huống mà tôi cần GetAllProducts()
và GetSoldProducts()
.
tôi không thích những gì tôi đang đọc! Đó là loại hạn chế asp.net web api capabilites. – WinFXGuy
@WinFXGuy - quá dài để nhận xét ... xem cập nhật – EBarr
Tôi thấy rằng nó nhìn vào tên tham số để giải quyết tình trạng quá tải. Vì vậy, api/thực phẩm? Name = cam được gọi là GetFoodByName (tên chuỗi) và api/food? Category = fruit có tên GetFoodByCategory (loại chuỗi). –