0

我通过 Web API 公开功能,我想公开的 url 例如:

  • /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 中。

4

1 回答 1

0

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

于 2013-08-26T14:11:35.650 回答