定义Web API路由

时间:2013-08-26 13:59:06

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

我通过Web API公开功能,我想要公开的网址是:

  • / api / organizations(返回组织名单(GET))
  • / api / organizations?$ top = 2(返回按oData(GET)过滤的组织列表)
  • / api / organizations / 2(返回ID为2(GET)的组织的详细信息)
  • / api / organizations / addinstitution(向组织添加新机构(POST))
  • / api / organizations / removeinstitution(删除机构(POST))

为了做到这一点,我不得不改变 WebApiConfig 类中的路由,如:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { id = @"\d*" }
        );

 config.Routes.MapHttpRoute(
            name: "SpecificActionsRoute",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );     

这似乎有效,但我想知道这是否是定义路线的最佳方式。我需要两条路线吗?可能有更好的方法吗?

编辑:要完成,我必须说我也使用属性路由,如:

[GET("organizations")]
public IQueryable<OrganizationSummaryViewModel> Get(ODataQueryOptions<Organization> oDataQuery)
{
}

[GET("organizations/{id}")]
public OrganizationDetailsViewModel Get(int id)
{
}

[POST("organizations/addinstitutiontoorganization")]
public AddInstitutionToOrganizationCommandResult AddInstitutionToOrganization(AddInstitutionToOrganizationCommand command)
{
}

[POST("organizations/anotheroperation")]
public AnotherOPerationCommandResult AnotherOperation(AnotherOperationCommand command)
{
}

编辑2:我最终删除了属性路由,并在WebApiConfig中保留了两个模板化路由。

1 个答案:

答案 0 :(得分:0)

您的配置是定义您计划处理的URL的路由的最佳方式。无法合并这两条路线,因为您处理两段网址的第一条路线将第二条段分配给id,而您处理三段网址的第二条路线则将第二条段分配给action。必须有两个不同的路由,因为您根据URL中是否有两个或三个段来分配不同的值。