2015-06-24 13 views
8

Có thể tùy chỉnh cơ chế định tuyến của ASP.NET Web API để định tuyến tất cả các yêu cầu tới API tới một phương pháp điều khiển không?Định tuyến tất cả các yêu cầu API Web tới một phương thức điều khiển

Nếu một yêu cầu đến để

www.mysite.com/api/products/ 

hoặc

www.mysite.com/api/otherResource/7 

Tất cả sẽ được chuyển đến phương pháp của tôi SuperDuperController của Get()?

+0

bạn có thể quan tâm đến http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection –

Trả lời

1

Tôi không biết tại sao bạn muốn làm điều này và tôi chắc chắn sẽ không khuyên bạn nên định tuyến tất cả mọi thứ thông qua một bộ điều khiển, tuy nhiên bạn có thể đạt được điều này như sau. Giả sử bạn chỉ bao giờ sẽ có một tài nguyên với một id bắt buộc trong các cuộc gọi của bạn, thêm video này vào WebApiConfig của bạn:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{resource}/{id}", 
      defaults: new { controller = "SuperDuper", id = RouteParameter.Optional } 
     ); 
    } 
} 

Sau đó xác định phương pháp điều khiển của bạn như sau:

public class SuperDuperController : ApiController 
{ 
    public IHttpActionResult Get(string resource, int? id = null) 
    { 
     return Ok(); 
    } 
} 

Bạn sẽ cần phải quyết định IHttpActionResult thích hợp để trả lại cho từng loại tài nguyên khác nhau.

Ngoài ra sử dụng thuộc tính Routing, đảm bảo rằng config.MapHttpAttributeRoutes() hiện diện trong WebApiConfig của bạn và thêm các thuộc tính sau cho phương pháp điều khiển của bạn:

[RoutePrefix("api")] 
public class SuperDuperController : ApiController 
{ 
    [Route("{resource}/{id?}")] 
    public IHttpActionResult Get(string resource, int? id = null) 
    { 
     return Ok(); 
    } 
} 
5

tôi chạy vào một trường hợp tôi cần phải làm điều này. (Web API 2)

Lần đầu tiên tôi xem xét việc tạo tùy chỉnh IHttpControllerSelectorIHttpActionSelector s. Tuy nhiên, đó là một chút của một cách u ám xung quanh. Vì vậy, cuối cùng tôi đã giải quyết việc triển khai đơn giản này đã chết. Tất cả những gì bạn phải làm là thiết lập một tuyến ký tự đại diện. Ví dụ:

public class SuperDuperController : ApiController 
{ 
    [Route("api/{*url}")] 
    public HttpResponseMessage Get() 
    { 
     // url information 
     Request.RequestUri 
     // route values, including "url" 
     Request.GetRouteData().Values 
    } 
} 

Bất kỳ yêu cầu GET nào bắt đầu bằng "api /" sẽ được định tuyến theo phương thức trên. Điều đó bao gồm các URL được đề cập ở trên trong câu hỏi của bạn. Bạn sẽ phải tự mình tìm hiểu thông tin từ các Yêu cầu hoặc các đối tượng bối cảnh vì giá trị tuyến đường tự động và phân tích cú pháp mô hình này.

Điều tốt là bạn vẫn có thể sử dụng các bộ điều khiển khác (miễn là tuyến của chúng không bắt đầu bằng "api /").

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