zoukankan      html  css  js  c++  java
  • WebApi-2 自定义路由与默认路由

    向Web API添加路由

    public static void Register(HttpConfiguration config)
        {
                //// Web API 配置和服务
                //// 将 Web API 配置为仅使用不记名令牌身份验证。
                //config.SuppressDefaultHostAuthentication();
                //config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
    
                // Web API 启用特性路由
                config.MapHttpAttributeRoutes();
                //1.默认路由
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional },
                    constraints: new { id = @"d*" } //约束,这个表示匹配0个或多个数字
                    //constraints: new { id = @"d+" }  //正则d+表示匹配一个或多个数字
                );
    
                //2.自定义路由一:匹配到action
                config.Routes.MapHttpRoute(
                    name: "ActionApi",
                    routeTemplate: "actionapi/{controller}/{action}/{id}",  //将路由模板的前缀改成了“actionapi”。
                    defaults: new { id = RouteParameter.Optional }
                );
    
                //3.自定义路由二
                config.Routes.MapHttpRoute(
                    name: "TestApi",
                    routeTemplate: "testapi/{controller}/{ordertype}/{id}",
                    defaults: new { ordertype = "aa", id = RouteParameter.Optional }//只要{ordertype}按照路由规则去配置,都能找到对应的方法。
                );
            }

    Web API路由过程

    1、WebApi服务启动之后,会执行全局配置文件Global.asax.cs的 protected void Application_Start(){GlobalConfiguration.Configure(WebApiConfig.Register);} 方法,通过参数委托执行WebApiConfig.cs里面的 public static void Register(HttpConfiguration config) 这个方法,将所有配置的路由信息添加到 HttpRouteCollection 对象中。查看配置对象,我们会发现Routes属性指向HttpRouteCollection类的一个实例,而不是ASP.NET的RouteCollection类实例。Web API提供了一些直接依赖ASP.NET中RouteCollection类的MapHttpRoute版本,但这些路由只有在Web托管时才能使用,因此推荐使用HttpRouteCollection上的MapHttpRoute版本。

    2、当我们发送请求到WebApi服务器的时候,比如我们访问http://localhost:21528/api/Order这个url的时候,请求首先还是会被UrlRoutingModule监听组件截获,然后,将截获的请求在Routes路由集合中匹配到对应的路由模板(如果匹配不到对应的路由模板,则返回404),得到对应的IHttpRoute对象。IHttpRoute对象是Routes集合里面匹配到的一个实体。

    3、将IHttpRoute对象交给当前的请求的上下文对象RequestContext处理,根据IHttpRoute对象里面的url匹配到对应的controller,然后再根据http请求的类型和参数找到对应的action。这样一个请求就能找到对应的方法了。 

    一个请求过来之后,路由主要需要经历三个阶段

      1. 根据请求的url匹配路由模板
      2. 找到控制器  (反编译路由模块的代码,你会发现控制器的选择主要在IHttpControllerSelector这个接口的SelectController()方法里面处理。)
      3. 找到action (得到了控制器对象之后,Api引擎通过调用IHttpActionSelector这个接口的SelectAction()方法去匹配action。)

    使用特性路由

    如果http请求的方法相同(比如都是post请求),并且请求的参数也相同。我们可以在路由模板里面加上“{action}”,但是不提倡。推荐使用特性路由解决这个问题。下面代码说明如何如何使用特性路由。

    [RoutePrefix("api/order")] //同一个控制器的所有的action的所有特性路由标识一个相同的前缀,这种做法并非必须,但这样能够增加url的可读性。
        public class OrderController : ApiController
        {
            [HttpGet]
            public object GetAll()
            {
                return "Success";
            }
    
            [ActionName("TestApi")]  //如果你想要方法名和action的名称不一致,你也可以自定义action的名称,这个可以通过特性ActionName来实现
            [Route("{id:int=3}/OrderDetailById")]  //使用“{}”占位符动态传递参数,参数约束:这里约束可变部分{id}的取值必须是int类型。并且默认值是3.
            [HttpGet]
            public object GetById(int id)
            {
                return "Success" + id;
            }
    
            [HttpGet]
            public async Task<string> Get(string str)
            {
                GetDataHelper sqlHelper = new GetDataHelper();
                switch (str)
                {
                    case "异步处理"://
                        return await sqlHelper.GetDataAsync();
                    case "同步处理"://
                        return sqlHelper.GetData();
                }
                return "参数不正确";
            }       
        }
  • 相关阅读:
    浅谈localStorage本地存储
    前端代码中经常遇到的问题
    http状态码
    Transition 所支持的css属性
    ie8下的透明 问题
    #event.initMouseEvent
    svg 文字
    前端工作流程转变
    理解javascript 回调函数
    不要被npm、NodeJs、npm、webpack、vue-cli 这些名词搞晕
  • 原文地址:https://www.cnblogs.com/chenh/p/10742075.html
Copyright © 2011-2022 走看看