zoukankan      html  css  js  c++  java
  • ASP.NET Web API中的路由

    ASP.NET Web API的默认路由在App_Start目录中的WebApiConfig.cs文件中定义的。

        public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                // Web API 配置和服务
    
                // Web API 路由
                config.MapHttpAttributeRoutes();
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
            }
        }

    路由表中的每个条目都包含一个路由模板Web API的默认路由模板是“api / {controller} / {id}”。在此模板中,“api”是文字路径段,{controller}和{id}是占位符变量。

    当Web API框架收到HTTP请求时,它会尝试将URI与路由表中的某个路由模板进行匹配。如果没有路由匹配,则客户端收到404错误。

    找到匹配的路由后,Web API将选择控制器和操作:

    • 要查找控制器Controller,Web API会将“Controller”添加到{controller}变量的值中
    • 要查找操作方法action,Web API会查看HTTP方法,然后查找名称以该HTTP方法名称开头的操作。例如,对于GET请求,Web API会查找以“Get ...”开头的操作,例如“GetContact”或“GetAllContacts”。此约定仅适用于GET,POST,PUT和DELETE方法。
    • 路径模板中的其他占位符变量(例如{id})将映射到操作参数。

    按操作名称路由

    使用默认路由模板,Web API使用HTTP方法选择操作。但是,您也可以创建一个路径,其中操作名称包含在URI中:

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

    在此路由模板中,{action}参数在控制器上命名操作方法。使用此样式的路由,使用属性指定允许的HTTP方法。

    public class ProductsController : ApiController
    {
        [HttpGet]
        [ActionName("Thumbnail")]//使用ActionName属性覆盖操作名称
        public HttpResponseMessage GetThumbnailImage(int id);
    
        [HttpPost]
        [ActionName("Thumbnail")]
        public void AddThumbnailImage(int id);
    
        //非操作:要防止将方法作为操作调用,请使用NonAction属性。这向框架发出信号,表明该方法不是动作,即使它与路由规则匹配。
        // Not an action method.
        [NonAction]  
        public void DeleteThumbnailImage(int id);
    }

    路由有三个主要阶段:

    1. 将URI与路由模板匹配。
    2. 选择一个控制器。
    3. 选择一个动作。

    路由模板:Route Templates

    1、路由模板类似于URI路径,但它有占位符值,用花括号表示,其中 占位符匹配任何值。

    "api/{controller}/{category}/{id}"

    2、创建路径是,可以部分或者全部为占位符提供默认值:

    defaults: new { category = "all" }

    3、还可以提供约束,用以约束现在URI段与占位符匹配的方式:

    constraints: new { id = @"d+" }   // Only matches if "id" is one or more digits.

    默认

    如果提供默认值,则路由将匹配缺少这些段的URI。例如:

    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{category}",
        defaults: new { category = "all" }
    );

    URI“http://localhost/api/products ”匹配此路由。“{category}”段被分配了默认值“all”。

    Route Dictionary

    如果框架找到URI的匹配项,它将创建一个包含每个占位符的值的字典。键是占位符名称,不包括花括号。值来自URI路径或默认值。字典存储在IHttpRouteData对象中。

    在此路由匹配阶段,特殊的“{controller}”和“{action}”占位符将被视为与其他占位符一样。它们只是与其他值一起存储在字典中。

    默认值可以具有特殊值RouteParameter.Optional如果为占位符分配了此值,则该值不会添加到路径字典中。例如:

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

    对于URI路径“api / products”,路由字典将包含:

    • controller: "products"
    • category: "all"

    但是,对于“api / products / toys / 123”,路线词典将包含:

    • controller: "products"
    • category: "toys"
    • id: "123"

    默认值还可以包含不会出现在路径模板中任何位置的值。如果路由匹配,则该值存储在字典中。例如:

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

    如果URI路径为“api / root / 8”,则字典将包含两个值:

    • controller: "customers"
    • id: "8"
  • 相关阅读:
    彻底理解cookie,session,token
    IP 别名和辅助 IP 地址
    1 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之DRBD的搭建
    centos配置DNS和ip
    centos的安装和下载
    activemq的学习
    mongodb的分片
    MongoDB的安装
    分布式事务中的三种解决方案详解(转载)
    redis中redis.conf配置文件解析
  • 原文地址:https://www.cnblogs.com/AndyChen2015/p/9590006.html
Copyright © 2011-2022 走看看