zoukankan      html  css  js  c++  java
  • ASP.NET Web API路由规则(二)

    默认的规则

    在ASP.NET MVC4中

    global.asax.cs代码中并无注册默认路由规则的代码

    代码如下:

        public class WebApiApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
    
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
            }
        }

    那么默认的路由规则是在哪里注册的呢?

    我们发现

    在项目中多了一个App_Start文件夹

    image

    其中RoteConfig.cs文件就是注册默认路由规则的程序所在了

    代码如下:

            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
            }

    这里有两个路由规则

    一个是针对API请求的路由规则

    另一个是针对普通MVC页面请求的路由规则

    请求路径以字符串”api”开头的时候将访问webAPI的函数

    (注:至于为什么用MapHttpRoute而不是MapRoute;为什么用routeTemplate而不是用url我们再以后的章节介绍)

    因为routeTemplate中有了{controller}

    所以针对api的请求可以自动映射到指定的controller类

    那么是怎么找到合适的Action的呢?

    系统根据请求的方式来判断

    如果是以GET的方式请求的

    那么将匹配controller中以“Get”开头的Action

    如果是以POST的方式请求的

    那么将匹配controller中以“Post”开头的Action

    如果是以PUT的方式请求的

    那么将匹配controller中以“Put”开头的Action

    如果是以DELETE的方式请求的

    那么将匹配controller中以“Delete”开头的Action

    除了这几个默认的请求方式

    你还可以在客户端定义你自己的请求方式!

    routeTemplate最后面的id匹配Action中的参数,

    这与ASP.NET MVC一致

    初步的自定义

    那么是不是所有的匹配GET请求的Action都必须以“Get”开头呢

    不是的

    我们可以用方法特性来标记一个方法属于什么什么请求

    如下:

            [HttpGet]
            public IEnumerable<Product> AllProducts()
            {
                return products;
            }
     

    对应的方法特性还有

    [HttpPost]

    [HttpDelete]

    [HttpPut]

    亦可以使用如下这样的方法特性来区分

    [AcceptVerbs("GET")]

    [AcceptVerbs("GET", "HEAD")]

    另外如果你在Controller中写了一个函数

    必须是public的,必须以Get开头

    而又不想让客户端以请求到此Action

    那么可以使用方法特性

    [NonAction]

    来标记此方法

    进一步自定义

    我们仍然可以把action的名字放到默认的请求规则中

    只要把routeTemplate改为如下即可:

                routes.MapHttpRoute(
                    name: "ActionApi",
                    routeTemplate: "api/{controller}/{action}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
     

    谢谢大家与我交流~~~~~

     
  • 相关阅读:
    Postgresql HStore 插件试用小结
    postgres-xl 安装与部署 【异常处理】ERROR: could not open file (null)/STDIN_***_0 for write, No such file or directory
    GPDB 5.x PSQL Quick Reference
    postgresql 数据库schema 复制
    hive 打印日志
    gp与 pg 查询进程
    jquery table 发送两次请求 解惑
    python 字符串拼接效率打脸帖
    postgresql 日期类型处理实践
    IBM Rational Rose软件下载以及全破解方法
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2557035.html
Copyright © 2011-2022 走看看