6

私はすべてのAPIエンドポイントを表示し、私が必要とするスタイルでそれらを表示するためのAPIヘルプページを手に入れようとしています。ここで.Net Web API Routing&Help Page

は私のルートです:ここでは

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 

例えば、私は終わる私が欲しいとき

PUT v1/Orgs?orgId={orgId} 

GET v1/Orgs/{orgId} 

または私はで終わる

PUT v1/Orgs/{orgId} 

どのような組み合わせであっても、私はそれらを欲しいと思っています。どんな助けでも大歓迎です!

+0

私は、 'GET v1/Orgs/{orgId}'ルートが 'Get(string orgId)'と 'Descendants(string orgId)'との間に矛盾があると思います。実際には、 '' v1/Orgs/{orgId} 'を取得しようとする可能性があり、「複数のアクションが見つかりました...」などのエラーが表示されます。 –

+0

このようなネストされたルートを定義すると、ネストされたリソースを別のコントローラとして使用する場合、あなたのケースでは 'DescendantsController'になります。そうすれば、必要に応じて子孫に完全な休憩APIを持たせることができます。おそらくそれはあなたが探索できる回避策です... – Tallmaris

+0

私は自分のコントローラに子孫を移動することを考えていましたが、それらもorgであるので、同じコントローラにそれらを保持して重複したコードを保存したかったのです。それは当分の間、最善の回避策かもしれないようです。私はそれを試して、それが動作するかどうかを確認します。 –

答えて

0

通常、この種の問題は、プロジェクトのアーキテクチャ(階層)に問題がある場合に満たされます。

さらに、ルーターを別の方法で追加しようとする場合があります。たとえば:これは役立つ

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

希望:

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

ルータハンドラは次のようになります。