6

我很努力地讓API幫助頁面顯示我所有的API端點,並以我想要的樣式顯示它們。.Net Web API路由和幫助頁面

這裏是我的路線:

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" }); 

這裏是我所有的控制器方法:

[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) 

這裏是端點幫助頁面顯示:

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

正如你可以看到,幫助頁面缺少以下端點:

GET v1/Orgs/{orgId} 

我已經嘗試了很多不同的路由排列,我失去了軌道。無論我嘗試什麼,我總是會丟失一些端點或錯誤地格式化。

例如,我結束了:

GET v1/Orgs/{orgId}/Get 

時,我想:

GET v1/Orgs/{orgId} 

或我結束了:

PUT v1/Orgs?orgId={orgId} 

時,我想:

PUT v1/Orgs/{orgId} 

無論我嘗試什麼樣的組合,我似乎都無法讓我們想要它們。任何幫助將非常感激!

+0

我在猜測HelpPage認爲'GET v1/Orgs/{orgId}'路線在'Get(string orgId)'和'Descendants(string orgId)'之間有衝突。實際上,你可能試着向'GET v1/Orgs/{orgId}'發出一個請求,並且會看到一個錯誤,比如說「發現了多個動作...」等。 –

+0

當我定義這樣的嵌套路由時,我通常會設置嵌套的資源作爲不同的控制器,你的情況下它將是'DescendantsController'。這樣,如果需要,您可以在Descendants上擁有完整的休息API。也許這是一個可以探索的解決方法... – Tallmaris

+0

我一直在考慮將後代移動到他們自己的控制器,但既然他們是組織,我也想讓他們在同一個控制器中保存重複的代碼。看起來這可能是目前最好的解決方法。我會試一試,看看它是否有效。 –

回答

0

Usualy,當項目架構(層次結構)出現問題時,會遇到這種問題。

此外,您可能會嘗試以不同的方式添加路由器。例如:

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

路由器的處理程序將看起來像:

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; 
    } 
} 

希望這會有所幫助。