ASP.NET WebApi 路由配置

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、启动项目,浏览器测试:
ASP.NET WebApi 路由配置_第1张图片
可以看到通过get请求获取到了数据

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

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

        public string Get2()
        {
            return "value2";
        }


    }

启动项目,浏览器测试:
ASP.NET WebApi 路由配置_第2张图片

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

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

测试请求:
ASP.NET WebApi 路由配置_第3张图片
可以正确获取到数据,且如果是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";
        }
    }

测试:
ASP.NET WebApi 路由配置_第4张图片
ASP.NET WebApi 路由配置_第5张图片
ASP.NET WebApi 路由配置_第6张图片
请求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();
            ...
        }
    }

你可能感兴趣的:(c#,web前端开发,路由配置,WebApi)