首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Asp.Net WebAPI来路由此?

如何使用Asp.Net WebAPI来路由此?
EN

Stack Overflow用户
提问于 2012-10-22 19:35:40
回答 2查看 3.3K关注 0票数 1

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

代码语言:javascript
复制
 GET Api/Items

它列出了所有的项目。当然,我也需要将这些项目列为“最受欢迎”,或者“属于用户x”或“属于类别Y”。

当浏览stackoverflow 2.0 api以了解他们如何解决此问题时,他们将其URLS命名为:

代码语言:javascript
复制
 GET Api/Items/MostPopular

我想要采用的这种方法看起来很有意义,看起来也很好。

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

代码语言:javascript
复制
config.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = RouteParameter.Optional }
);

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

代码语言:javascript
复制
config.Routes.MapHttpRoute(
      name: "SpecializedApi",
      routeTemplate: "api/{controller}/MostPopular",
      defaults: new { id = RouteParameter.Optional }
);

但是它会为我所有的控制器添加MostPopular位,这是我不喜欢的。

像这样的东西能工作吗?

代码语言:javascript
复制
 config.Routes.MapHttpRoute(
      name: "SpecializedApi",
      routeTemplate: "api/Items/MostPopular",
      defaults: new { id = RouteParameter.Optional }
 );

如果我的路由表很快就会变得非常大,并且可能无法维护,那么这真的是可行的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-22 19:52:16

最好的做法是添加另一个get操作,并配置一个通用route而不是specific路由。

首先为最受欢迎的用户添加操作

代码语言:javascript
复制
// add action for Most Popular
[ActionName("MostPopular")]
public MyResult GetMostPopular()
{
     return null;
}

设置处理该操作的路由。

代码语言:javascript
复制
// 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}"
);
票数 3
EN

Stack Overflow用户

发布于 2012-10-22 19:52:37

如果您没有太多偏离默认设置,那么可能是最好的可维护性,但是您应该像这样指定路由中的控制器和操作:

代码语言:javascript
复制
config.Routes.MapHttpRoute( 
    name: "SpecializedApi", 
    routeTemplate: "api/Items/MostPopular/{id}", 
    defaults: new { controller = "wheretogo",
                    action = "wichactiontotake",
                    id = RouteParameter.Optional 
                  } 
);

或者这也行得通:

代码语言:javascript
复制
config.Routes.MapHttpRoute( 
    name: "SpecializedApi", 
    routeTemplate: "api/test/{action}/{id}.html",
    defaults: new { controller = "test" } 
);

当使用假文件配置IIS时,请查看此链接:http://haacked.com/archive/2008/11/26/asp.net-mvc-on-iis-6-walkthrough.aspx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13010632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档