.Net Web API路由&帮助页面

时间:2013-07-10 14:59:43

标签: c# .net asp.net-mvc asp.net-web-api asp.net-web-api-routing

我正在努力获取API帮助页面以显示我的所有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}

我已经尝试了很多不同的路由排列,我已经失去了轨道。无论我尝试什么,我总会得到一些端点缺失或错误的&#39;格式化。

例如,我最终得到:

GET v1/Orgs/{orgId}/Get

我想要的时候:

GET v1/Orgs/{orgId}

或者我最终得到:

PUT v1/Orgs?orgId={orgId}

我想要的时候:

PUT v1/Orgs/{orgId}

无论我尝试什么组合,我似乎无法将它们全部送到我想要的地方。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

通常,当项目架构(层次结构)出现问题时,会遇到这种问题。

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

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

希望这会有所帮助。