2013-08-26 60 views
0

我通過Web API曝光功能,並且我要揭露的網址是例如:定義Web API路線

  • /API /機構(組織名單回報(GET))
  • /api/organizations?$ top = 2(返回由oData(GET)過濾的組織列表)
  • /api/organizations/2(返回組織ID爲2(GET)的詳細信息)
  • /api/organizations /添加機構(向機構添加新機構(POST))
  • /API /組織/ 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兩個模板化路線。

+0

您的第一條路線是否需要「行動」的默認值? – asymptoticFault

+0

第一個路由會自動映射到Get或Get(int id)。我認爲這是因爲它是一個ApiController? –

+0

還有一種定義路由的替代方法,它被稱爲屬性路由。我需要它時,我必須定義3個級別。看看這個:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 – alfoks

回答

0

您的配置是爲您計劃處理的URL定義路由的最佳方式。由於處理兩段網址的第一條路線將第二段分配給id,而處理三段網址的第二條路線將第二段分配給action,因此無法合併這兩條路線。有必要有兩條不同的路線,因爲您根據網址是否有兩個或三個網段來分配不同的值。