2013-01-16 175 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