Skip to main content
 首页 » 编程设计

c#之如何使用 Asp.Net WebAPI 进行路由

2024年02月20日28emanlee

我正在制作一个 Restful 服务,其中我有一个项目列表,可以这样查询:

 GET Api/Items 

其中列出了所有项目。 但当然,我还需要将这些项目列为“最受欢迎”、“属于用户 x”或“属于类别 Y”

当浏览 stackoverflow 2.0 api 以了解他们如何解决这个问题时,他们将 URLS 命名如下:

 GET Api/Items/MostPopular 

我想采用这种方法,因为它看起来很有道理而且看起来不错。

但是,如何配置 Web-API 以允许此 URL 语法? 默认路由如下:

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

所以我想我需要在它前面添加额外的路由。 我可以这样做:(如果这可行的话)

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

但随后它会为我不喜欢的所有 Controller 添加 MostPopular 位。

这样的东西有用吗?

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

这真的是我的路由表会很快变得非常大并且可能无法维护的方法吗?

请您参考如下方法:

最好的办法是添加另一个获取操作并配置通用路由而不是特定路由。

首先为最受欢迎的添加 Action

// add action for Most Popular 
[ActionName("MostPopular")] 
public MyResult GetMostPopular() 
{ 
     return null; 
} 

设置路由来处理 Action 。

// Controller with ID 
// To handle routes like `/api/Items/1` 
config.Routes.MapHttpRoute( 
    name: "ControllerAndId", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: null, 
    constraints: new { id = @"^\d+$" } // Only integers  
); 
 
// Controllers with Actions 
// To handle routes like `/api/Items/MostPopular` 
config.Routes.MapHttpRoute( 
    name: "ControllerAndAction", 
    routeTemplate: "api/{controller}/{action}" 
);