6

Tôi đang cố gắng để có được trang trợ giúp API để hiển thị tất cả các điểm cuối API của tôi và hiển thị chúng theo kiểu tôi muốn.. Trang web trợ giúp và định tuyến API WebNet

Dưới đây là tuyến đường của tôi:

config.Routes.MapHttpRoute("Orgs", "v1/Orgs/{orgId}", 
new { controller = "Orgs", orgId = RouteParameter.Optional }); 

config.Routes.MapHttpRoute("OrgDescendants", "v1/Orgs/{orgId}/Descendants", 
new { controller = "Orgs", action = "OrgDescendants" }); 

Dưới đây là tất cả các phương pháp điều khiển của tôi:

[HttpGet] 
public IEnumerable<Org> GetAllOrgs() 

[HttpGet] 
public Org Get(string orgId) 

[HttpGet] 
[ActionName("OrgDescendants")] 
public List<Org> Descendants(string orgId) 

[HttpPost] 
public HttpResponseMessage Post(Org org) 

[HttpPut] 
public HttpResponseMessage Put(string orgId, Org org) 

[HttpDelete] 
public void Delete(string orgId) 

Và đây là thiết bị đầu cuối mà hiển thị trang trợ giúp:

GET v1/Orgs 
POST v1/Orgs 
PUT v1/Orgs/{orgId} 
DELETE v1/Orgs/{orgId} 
GET v1/Orgs/{orgId}/Descendants 

Như bạn có thể thấy, trang trợ giúp thiếu điểm cuối sau:

GET v1/Orgs/{orgId} 

Tôi đã thử rất nhiều hoán vị định tuyến khác nhau mà tôi đã mất dấu vết. Bất cứ điều gì tôi cố gắng tôi luôn luôn kết thúc với một số thiết bị đầu cuối bị thiếu hoặc 'không chính xác' định dạng.

Ví dụ, tôi kết thúc với:

GET v1/Orgs/{orgId}/Get 

khi tôi muốn:

GET v1/Orgs/{orgId} 

hoặc tôi kết thúc với:

PUT v1/Orgs?orgId={orgId} 

khi tôi muốn:

PUT v1/Orgs/{orgId} 

Không có vấn đề gì kết hợp tôi cố gắng tôi không thể có vẻ để có được tất cả các cách tôi muốn họ. Bất kì sự trợ giúp nào đều được đánh giá cao!

+0

Tôi đoán HelpPage nghĩ rằng tuyến 'GET v1/Orgs/{orgId}' có xung đột giữa 'Nhận (chuỗi orgId)' và 'Hậu duệ (chuỗi orgId)'. Trên thực tế, bạn có thể thử thực hiện yêu cầu cho 'GET v1/Orgs/{orgId}' và sẽ thấy lỗi giống như nói "Nhiều hành động đã được tìm thấy ...", v.v. –

+0

Khi tôi định nghĩa các tuyến lồng nhau như thế này, tôi thường đặt tài nguyên lồng nhau như một bộ điều khiển khác, nó sẽ là 'DescendantsController' trong trường hợp của bạn. Bằng cách đó bạn có thể có một API còn lại đầy đủ trên Con cháu nếu cần. Có lẽ đó là cách giải quyết bạn có thể khám phá ... – Tallmaris

+0

Tôi đã suy nghĩ về việc di chuyển con cháu đến bộ điều khiển riêng của họ nhưng vì chúng cũng là tổ chức tôi muốn giữ chúng trong cùng một bộ điều khiển để lưu trên mã trùng lặp. Có vẻ như đó có thể là giải pháp tốt nhất trong thời gian này. Tôi sẽ thử xem nó có hiệu quả không. –

Trả lời

0

Thông thường, loại vấn đề này được đáp ứng, khi có vấn đề với kiến ​​trúc dự án (phân cấp).

Hơn nữa, bạn có thể thử thêm bộ định tuyến theo cách khác. Ví dụ:

RouteTable.Routes.Add(
      "UserProfiles", 
      new Route("Profile/{uid}/{mode}", new ProfileRouterHandler("~/Profile/Default.aspx"))); 

Việc xử lý bộ định tuyến sẽ giống như thế:

public class ProfileRouterHandler: IRouteHandler 
{ 
    private string VirtualPath { get; set; } 
    public ProfileRouterHandler() 
    { 

    } 

    public ProfileRouterHandler(string virtualPath) 
    { 
     VirtualPath = virtualPath; 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     string param = requestContext.RouteData.Values["uid"] as string; 
     string mode = requestContext.RouteData.Values["mode"] as string; 
     long id; 
     long.TryParse(param, out id); 
     if (id > 0) 
     { 
      string filePath = "~/Profile/Default.aspx?uid=" + param + (!string.IsNullOrEmpty(mode) ? "&mode=" + mode : ""); 
      VirtualPath = "~/Profile/Default.aspx"; 
      HttpContext.Current.RewritePath(filePath); 
     } 
     else 
     { 
      string filePath = "~/Profile/" + param + ".aspx"; 
      VirtualPath = filePath; 
      HttpContext.Current.RewritePath(filePath); 
     } 

     return BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as Page; 
    } 
} 

Hy vọng điều này sẽ giúp.

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