2

我正在使用 Web API 来公开一堆服务。我遇到了一些路线问题,需要一些帮助。

我定义了默认路由:

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

使用这条路线,我可以到达正常路线,例如:'/api/clients/' 和 '/api/clients/4'。我想要一个 GET 访问以下路由“api/clients/4/profiles”和“api/clients/4/validations”。

我尝试了以下路线但没有成功:

config.Routes.MapHttpRoute(
    name: "ClientProfilesApi",
    routeTemplate: "api/{controller}/{clientid}/profiles",
    defaults: new { action = RouteParameter.Optional },
    constraints: new { controller = "clients" }
    );

 config.Routes.MapHttpRoute(
   name: "ClientValidationsApi",
       routeTemplate: "api/{controller}/{clientid}/validations",
       defaults: new { action = RouteParameter.Optional },
   constraints: new { controller = "clients" }
   );

我还尝试使用“ActionName”属性,如下所示:

[HttpGet]
[ActionName("profiles")]
public IEnumerableResponseDto<ProfileLayoutDto> GetProfiles(Int64 clientId, [FromUri] IEnumerableRequestDto request)
{ .... }


[HttpGet]
[ActionName("profiles")]
public IEnumerableResponseDto<ValidationLayoutDto> GetValidations(Int64 clientId, [FromUri] IEnumerableRequestDto request)
{ .... }

我错过了什么?一个控制器中不可能有多个 GET 吗?

4

2 回答 2

3

对于路由“api/clients/4/profiles”和“api/clients/4/validations”,将操作命名为“profiles”和“validations”,然后在默认路由之前使用以下路由:

config.Routes.MapHttpRoute(
    name: "ClientProfilesApi",
    routeTemplate: "api/clients/{clientid}/profiles",
    defaults: new { controller = "clients", action = "profiles",  },
    constraints: new {clientid = @"\d+" }
    );

 config.Routes.MapHttpRoute(
    name: "ClientValidationsApi",
    routeTemplate: "api/clients/{clientid}/validations",
    defaults: new { controller = "clients", action = "validations",  },
    constraints: new {clientid = @"\d+" }       );

这意味着路由“api/clients/4/profiles”转到控制器“clients”和操作“profiles”,并且参数“clientid”必须是整数。

默认路由应始终在最后。

于 2013-01-16T02:59:31.417 回答
0

你需要:

config.Routes.MapHttpRoute(
name: "ClientApi",
routeTemplate: "api/{controller}/{clientid}/{action}",
defaults: new { action = RouteParameter.Optional },
constraints: new { controller = "clients" }
);

您可能仍需要 ActionName 属性(但我不确定),并且您可能希望从操作中删除 RouteParameter.Optional 默认值,除非您还希望获得 Get 请求(例如):

api/clients/4

由控制器中的 Get 操作提供服务。

于 2013-01-16T02:49:18.160 回答