V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
azev
V2EX  ›  问与答

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

  •  
  •   azev · 2017-11-21 17:17:45 +08:00 · 1558 次点击
    这是一个创建于 2561 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我知道通过 /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 }
            );
        }
    }
    
    8 条回复    2018-03-08 20:28:43 +08:00
    sxw11
        1
    sxw11  
       2017-11-21 17:25:38 +08:00
    你贴的这个是 MVC 的路由,然而 webapi 项目走的是 WebApiConfig 的 Route
    sxw11
        2
    sxw11  
       2017-11-21 17:27:19 +08:00
    azev
        3
    azev  
    OP
       2017-11-21 17:39:55 +08:00
    是得 默认新建的 webapi 项目中是包含了那个 WebApiConfig
    但是也包含了默认的路由模板啊 就是我主贴里贴的那段

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

    "webapi 里 action 是 http 的四种方法" 为什么那个 get 函数不能视为一个 action 的名字呢?
    aaronlam
        6
    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
        7
    azev  
    OP
       2018-03-08 16:08:24 +08:00
    @aaronlam
    为什么没有走 MVC 这个路由呢?原因在哪?
    aaronlam
        8
    aaronlam  
       2018-03-08 20:28:43 +08:00
    @azev

    1.因为你没有一个叫做 ValuesController 的类继承 Controller,所以 MVC 路由就路由不到你所制定的这个 /values/get/1 路径。
    2.WebAPI 默认工程里的 ValuesController 类继承的是 ApiController,所以就走 WebApi 的路径去了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4933 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 10:00 · PVG 18:00 · LAX 02:00 · JFK 05:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.