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 }
                );
     

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

     
  • 相关阅读:
    数组常用操作实现
    链表简单实现栈与队列
    亿万级别的表数据处理方式
    ubuntu安装与卸载.dep软件
    pg数据库表接口和数据导出
    深入分析理解Tomcat体系结构
    Servlet源码级别进行详解
    Maven命令行创建java或javaWeb项目
    解释语言与编译语言
    C++中Reference与Pointer的不同
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2557035.html
Copyright © 2011-2022 走看看