ASP.NET WebApi 路由配置

来源:互联网 发布:下载软件的软件有哪些 编辑:程序博客网 时间:2024/05/18 02:42

WebApi相关文章:

  • C# 搭建一个简单的Web API项目
  • C# WebApi 路由配置
  • c# WebApi之解决跨域问题:Cors
  • c# WebApi之身份验证:Basic基础认证
  • c# WebApi之接口返回类型详解

一、模板路由

1、在App_Start文件夹下面的WebApiConfig,默认路由配置为:

using System;using System.Collections.Generic;using System.Linq;using System.Web.Http;namespace testAPI{    public static class WebApiConfig    {        public static void Register(HttpConfiguration config)        {            config.Routes.MapHttpRoute(                name: "DefaultApi",                routeTemplate: "api/{controller}/{id}",                defaults: new { id = RouteParameter.Optional }            );            config.EnableSystemDiagnosticsTracing();        }    }}

url:api/{controller}/{id}

2、在控制器里面添加一个get请求:

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Http;using System.Web.Http;namespace testAPI.Controllers{    public class ValuesController : ApiController    {        [HttpGet]        public string Get1()        {            return "value1";        }    }}

3、启动项目,浏览器测试:
这里写图片描述
可以看到通过get请求获取到了数据

4、在控制器里面再添加一个get请求:

public class ValuesController : ApiController    {        [HttpGet]        public string Get1()        {            return "value1";        }        public string Get2()        {            return "value2";        }    }

启动项目,浏览器测试:
这里写图片描述

我们发现发生错误:找到了与该请求匹配的多个操作
那要怎么处理呢,把第二个方法改成post请求:

public class ValuesController : ApiController    {        [HttpGet]        public string Get1()        {            return "value1";        }        [HttpPost]        public string Get2()        {            return "value2";        }    }

测试请求:
这里写图片描述
可以正确获取到数据,且如果是post请求返回Get2的信息,如果是get请求返回Get1的信息;

从上面两个测试我们可以得出如下结论:
当多个action的 请求方式一样的话,在默认路由模板下(没有action),将会匹配多个操作。 基于上面两点结论,默认路由模板无法满足针对一种资源一种请求方式的多种操作。

5、自定义一个路由:

public static class WebApiConfig    {        public static void Register(HttpConfiguration config)        {            config.Routes.MapHttpRoute(                name: "DefaultApi",                routeTemplate: "api/{controller}/{id}",                defaults: new { id = RouteParameter.Optional }            );            //自定义路由:匹配到action            config.Routes.MapHttpRoute(                name: "ActionApi",                routeTemplate: "actionapi/{controller}/{action}/{id}",                defaults: new { id = RouteParameter.Optional }            );            config.EnableSystemDiagnosticsTracing();        }    }

控制器方法:

 public class ValuesController : ApiController    {        public string Get1()        {            return "value1";        }        public string Get2()        {            return "value2";        }    }

测试:
这里写图片描述
这里写图片描述
这里写图片描述
请求http://localhost:26753/actionapi/values返回404错误;
请求http://localhost:26753/actionapi/values/get1返回Get1的信息;
请求http://localhost:26753/actionapi/values/get2返回Get2的信息;

通过定制路由模板我们可以得出如下结论:
通过在路由模板中增加action目录,对资源的定位直接作用到action上。 多个HttpGet方法可以共存于一个controller中。

二、特性路由

特性路由主要处理一些比较复杂的请求url,如资源之间存在嵌套关系:客户包含订单,书有作者属性等等。对于这种Uri,我们希望的路由是这样的:/costomers/{customerid}/orders 或 /costomers/{customerid}/orders/{orderid}

考虑到这只是某个Controller的路由格式,而我们会有很多个Controller,用基于约定路由显然不合适(要配置很多的路由)

使用特性路由就简单了,在action上加一个特性即可

[Route("customers/{productId}/orders")]public string getProductName(int productId){    return "name";}

使用特性路由需要在WebApiConfig中添加config.MapHttpAttributeRoutes();

public static class WebApiConfig    {        public static void Register(HttpConfiguration config)        {            config.MapHttpAttributeRoutes();            ...        }    }
原创粉丝点击