6

Staram się uzyskać stronę pomocy API, aby pokazać wszystkie moje punkty końcowe API i pokazać je w pożądanym przeze mnie stylu..Net Web API Routing i pomoc Strona

Oto moje trasy:

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

Oto wszystkie moje metody kontrolera:

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

A oto punkty końcowe że strona help Wyświetla:

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

jak ty można zobaczyć, na stronie pomocy brakuje następującego punktu końcowego:

GET v1/Orgs/{orgId} 

Próbowałem tak wielu różnych permutacji routingu, które utraciłem. Niezależnie od tego, co wypróbuję, zawsze otrzymuję informację, że brakuje niektórych punktów końcowych lub są one "nieprawidłowo" sformatowane.

Na przykład, ja skończyć z:

GET v1/Orgs/{orgId}/Get 

kiedy chcę:

GET v1/Orgs/{orgId} 

lub I skończyć z:

PUT v1/Orgs?orgId={orgId} 

kiedy chcę:

PUT v1/Orgs/{orgId} 

Bez względu na to, jaką kombinację próbuję, nie mogę sprawić, że będą je wszystkie tak, jak chcę. Każda pomoc będzie doceniona!

+0

Zgaduję, że HelpPage uważa, że ​​trasa 'GET v1/Orgs/{orgId}' ma konflikty między 'Get (string orgId)' i 'Descendants (string orgId)'. Właściwie mógłbyś prawdopodobnie spróbować wysłać polecenie 'GET v1/Orgs/{orgId}' i powinien zobaczyć błąd podobny do powiedzenia "Wiele akcji zostało znalezione ..." itd. –

+0

Kiedy definiuję takie zagnieżdżone trasy, zwykle ustawiam zagnieżdżone zasoby jako inny kontroler, w twoim przypadku byłby to "DescendantsController". W ten sposób możesz mieć pełny odpoczynek API na potomkach, jeśli to konieczne. Być może jest to obejście, które możesz zbadać ... – Tallmaris

+0

Myślałem o przeniesieniu potomków do ich własnego kontrolera, ale ponieważ oni również są organizacjami, chciałem zatrzymać ich w tym samym kontrolerze, aby zaoszczędzić na powielonym kodzie. Wygląda na to, że może to być najlepszym rozwiązaniem na razie. Spróbuję i zobaczę, czy to działa. –

Odpowiedz

0

Zazwyczaj ten problem występuje, gdy występują problemy z architekturą projektu (hierarchią).

Co więcej, możesz spróbować dodać routery w inny sposób. Na przykład:

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

Handler Router będzie wyglądać następująco:

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

nadzieję, że to pomoże.

Powiązane problemy