2012-06-12 39 views
5

Web api dường như chỉ phù hợp với các trường hợp sử dụng chuẩn. Nhưng tôi muốn thực hiện định tuyến phức tạp hơn nhưng không thể tìm thấy tài liệu để định tuyến phức tạp. Nếu tôi có nhiều bộ điều khiển hơn, các định tuyến ngày càng phức tạp hơn.ASP.NET 4 MVC Web API: Tài liệu dành cho định tuyến phức tạp

Tôi có thể xác định một số thông số tùy chọn với phụ thuộc không? Như thế này:

/api/document/{par1}/{par2} 

par1 & par2 nên không bắt buộc nhưng par2 nên chỉ phù hợp nếu par1 có mặt.

Và có thể tham số đệ quy không?

/api/documents/characteristics/{round/green/red-dots} 
/api/documents/characteristics/{square/yellow} 
/api/documents/characteristics/{square/yellow/flat} 
/api/documents/characteristics/{square/yellow/flat/...} 

Có tài liệu chi tiết về định tuyến api trên web không? Hướng dẫn microsoft quá cơ bản ... Tôi cần thêm thông tin về định tuyến.

Tôi có hai bộ điều khiển và một số sự cố vì hai tuyến đường khá giống nhau, vì vậy tuyến đường sai được thực hiện. Tôi có thể sử dụng [Hành động] - Thuộc tính như một cách giải quyết, nhưng điều này cảm thấy không đúng ... Tôi cũng phải xem xét thứ tự của các tuyến đường. Điều này là hợp lý nhưng không được đề cập đến. Web api chỉ dành cho phần còn lại đơn giản của api?


Edit: Tôi cố gắng này:

routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{mandant}/documents/{id}", 
      defaults: new { controller = "documents", id = RouteParameter.Optional } 
      ); 

//routes.MapHttpRoute(
// name: "DefaultApiWithAction", 
// routeTemplate: "api/{mandant}/documents/{id}/{action}", 
// defaults: new { controller = "documents" } 
// ); 

Tôi có hai phương pháp:

[AcceptVerbs("get")] 
public HttpResponseMessage Get(int id) 

[ActionName("file")] 
[AcceptVerbs("get")] 
public HttpResponseMessage filedownload(int id) 

Bây giờ tôi có vấn đề, file-action được kích hoạt ngay cả khi tôi nhận xét ra các tuyến đường thứ hai và bình thường có được phương pháp tài liệu cụ thể không được kích hoạt bởi vì nhiều hành động ... Tôi đã cố gắng [NoAction] thuộc tính nhưng điều này tôi không hoạt động ... Nhưng tại sao phương pháp tệp sẽ được kích hoạt nếu không có hành động nào trong mẫu tuyến đường? (Hoặc nếu tuyến đường thứ hai đang hoạt động, tại sao phương thức get-document bình thường không được kích hoạt nếu không có hành động nào trong url ....) Cách giải quyết hiện tại của tôi là đặt hành động mặc định cho tất cả các phương thức khác, nhưng đây không phải là giải pháp tốt.

Trả lời

8

Bạn có thể sử dụng chế định tuyến để thiết lập điều kiện về định tuyến trong global.asax như:

routes.MapRoute(
    "ApiRoute", 
    "api/document/{par1}/{par2}", 
    new {controller="Document", action="SomeMethod"}, 
    new {par1 = @"\d+" } 
); 

Trong tham số cuối cùng bạn có thể xác định biểu thức chính quy mà đã được xuất hiện cho tham số quy định cho các tuyến đường đến được đã sử dụng. Trong ví dụ trên par1 chỉ được sử dụng cho các chữ số, nhưng bạn có thể sử dụng bất kỳ cụm từ thông dụng nào, như:

routes.MapRoute(
    "ApiRoute", 
    "api/document/{par1}/{par2}", 
    new {controller="Document", action="SomeMethod"}, 
    new {par1 = @"(value1|value2|value3)" } 
); 
+0

Đặt điều khiển tĩnh làm mặc định sẽ xử lý xung đột tuyến đường. Rằng bạn có thể sử dụng những ràng buộc là mới đối với tôi. Cảm ơn. Một tài liệu hướng dẫn microsoft tốt cho định tuyến api trên web sẽ rất tuyệt. Tôi cũng thấy rằng bạn có thể sử dụng * như tham số catch-all như {* param} này nhưng nó phải ở cuối url. – user437899

+2

Tôi đã tìm thấy tài liệu chung này cho định tuyến asp.net: http://msdn.microsoft.com/en-us/library/cc668201.aspx – user437899

Các vấn đề liên quan