asp.net webapi 中的 ApiController 类到底有什么特殊?

2017-11-21 17:17:45 +08:00
 azev

我知道通过 /api/values/1 可以定位到 ValuesController.Get(int id)这个方法

我的问题是那 直接这么请求 /values/get/1 为啥报错呢? 我看项目中也有注册这个路由啊

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}
1563 次点击
所在节点    问与答
8 条回复
sxw11
2017-11-21 17:25:38 +08:00
你贴的这个是 MVC 的路由,然而 webapi 项目走的是 WebApiConfig 的 Route
sxw11
2017-11-21 17:27:19 +08:00
azev
2017-11-21 17:39:55 +08:00
是得 默认新建的 webapi 项目中是包含了那个 WebApiConfig
但是也包含了默认的路由模板啊 就是我主贴里贴的那段

我的理解是两种 url 应该都可以访问到那个 action,可现在却是只有一种 url 能正常访问
另一个就报错
sxw11
2017-11-21 17:54:06 +08:00
MVC action 是你的方法名,webapi 里 action 是 http 的四种方法,不是一个东西,去看看二楼的文章,很详细的。。
azev
2017-11-21 18:21:23 +08:00
那文章看过了 但是不能解释我的问题

"webapi 里 action 是 http 的四种方法" 为什么那个 get 函数不能视为一个 action 的名字呢?
aaronlam
2018-03-08 10:03:17 +08:00
楼主你现在贴的这个是 MVC 的路由,你要去 WebApiConfig.cs 里把默认的 WebApi 路由改成这样才能实现你想要的效果:

```
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
//routeTemplate: "api/{controller}/{id}",
routeTemplate: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional}
);

// 取消注释下面的代码行可对具有 IQueryable 或 IQueryable<T> 返回类型的操作启用查询支持。
// 若要避免处理意外查询或恶意查询,请使用 QueryableAttribute 上的验证设置来验证传入查询。
// 有关详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=279712。
//config.EnableQuerySupport();

// 若要在应用程序中禁用跟踪,请注释掉或删除以下代码行
// 有关详细信息,请参阅: http://www.asp.net/web-api
config.EnableSystemDiagnosticsTracing();
}
}
```
azev
2018-03-08 16:08:24 +08:00
@aaronlam
为什么没有走 MVC 这个路由呢?原因在哪?
aaronlam
2018-03-08 20:28:43 +08:00
@azev

1.因为你没有一个叫做 ValuesController 的类继承 Controller,所以 MVC 路由就路由不到你所制定的这个 /values/get/1 路径。
2.WebAPI 默认工程里的 ValuesController 类继承的是 ApiController,所以就走 WebApi 的路径去了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/408321

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX