2013-01-16 177 views
2

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

我已经定义了默认路由:

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

有了这条路,我可以打正常的途径,如: '/ API /客户/' 和 '/ API /客户/ 4'。我想要一个GET命中以下路线'api/clients/4/profiles'和'api/clients/4/validationations'。

我曾尝试没有成功以下途径:

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?

+0

你有什么错误? – tcarvin

+0

@tcarvin:未找到与请求URI'http:// localhost:4422/api/clients/11/profiles'匹配的HTTP资源。在控制器的“客户”上找不到与请求匹配的操作。 – Skadoosh

回答

3

对于路线“API /客户/ 4 /配置文件”和“API /客户/ 4 /验证”,命名行动“轮廓”和“验证”,然后使用下面的路由的缺省路由前:

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

这意味着route'api/clients/4/profiles'转到控制器的'clients'和action'profiles',参数'clientid'必须是一个整数。

默认路由应该总是最后的。

+0

是否可以对动作参数有一个约束?因此,在我的路线限制内,我可以采取行动=(“个人资料|验证”)吗?我想知道... – Skadoosh

+1

那也行!但是,只需使用“../{clientid}/{action}”就不需要约束,并且不使用默认操作 - 任何无法找到的操作都将404 – viperguynaz

0

您需要:

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

你可能仍然需要ActionName属性(但我不知道),你可能会想,除非你也想从动作中删除RouteParameter.Optional默认已获取(例如)的请求:

api/clients/4 

由您的控制器中的获取操作提供服务。

+0

我在默认路由之前添加了路由,并且添加了“ActionName”属性,但仍然像以前一样得到相同的错误。 – Skadoosh