ASP.NET Web API 路由小记

目录

创建ASP.NET Web API应用程序

路由表

属性路由


创建ASP.NET Web API应用程序

在Visual Studio 2019中,可以通过选择新建“ASP.NET Web Application (.NET Framework)”来创建一个新的Web API应用程序。通常本人会选择Empty模板,之后勾选"Web API"选项进行创建。

ASP.NET Web API 路由小记_第1张图片

在创建好的应用程序中,右键点击Controllers文件夹创建一个Controller类。

ASP.NET Web API 路由小记_第2张图片

ASP.NET Web API 路由小记_第3张图片

 

路由表

在ASP.NET Web API中,用来处理HTTP请求的类被称为“controller”。这些类以Controller为后缀进行命名,并且继承自System.Web.Http.ApiController类。controller中的public方法通常被称为“action methods”,当Web API framework接收到HTTP请求后,会根据一定的规则将请求路由到相应的action method进行处理,这些路由规则则是通过路由表进行定义的。利用Visual Studio创建Web API应用程序时,它会帮我们自动创建一个默认的路由表,既App_Start目录下的WebApiConfig.cs文件中。

默认的路由模板为"api/{controller}/{id}“,其中api为固定的文字字段,{controller}和{id}均为可变的参数字段。当API framework获取请求并为其找到一个可用的路由模板后,会通过在{controller}变量后添加"Controller"后缀来找到处理该请求的controller类;之后在默认配置中API framework会检测该请求的HTTP动作类型(如Get、Post、Put、Delete、Head、Options或Patch),并在上一步中的controller类中寻找以该动作名为前缀的public函数,找到后将请求路由给其进行处理。倘若controller中的public函数未以HTTP verb为前缀命名,则该函数默认仅支持POST方法。

关于public函数接收的HTTP动作,除了利用默认的函数命名规则外,还可以通过HTTP verb属性标签来进行设置,如下面这个例子中的ListMembers函数将接收并处理利用HTTP Get方法发送给api/demo的请求。欲了解更多的HTTP动作属性标签,可访问Routing in ASP.NET Web API。

public class DemoController: ApiController
{
    [HttpGet]
    public IHttpActionResult ListMembers()
    {
        ... ...
    }
}

 

属性路由

除了通过路由模板定义基于规约的路由之外,还可以利用属性路由来定义路由,从而更好地支持RestFul API的URI模式。所谓属性路由,其实就是通过向controller及action method添加"[Route(...)]"、"[RoutePrefix(...)]"等标签来定义路由规则的一种方式。属性路由是通过向上一小节中提到的WebApiConfig.cs的Register函数中添加如下代码启动的。

config.MapHttpAttributeRoutes();

如在下面这个例子中RetrieveMemberById函数将接收并处理利用HTTP Get方法发送给api/identity/member/1的请求。其中{id}部分会被替换为实际传入的值,本例中为1,既RetrieveMemberById函数接收到的参数id的值为1。

[RoutePrefix("api/identity")]
public class DemoController : ApiController
{
    [HttpGet]
    [Route("member/{id}")]
    public IHttpActionResult RetrieveMemberById(string id)
    {
        ...
    }
}

此外还可以通过Microsoft.AspNet.WebApi.Versioning来向属性路由中添加Web Api的版本信息。首先,向WebApiConfig.cs的Register函数中添加如下代码启动versioning功能。

var constraintResolver = new DefaultInlineConstraintResolver()
{
    ConstraintMap =
    {
        ["apiVersion"] = typeof(ApiVersionRouteConstraint)
    }
};
config.MapHttpAttributeRoutes(constraintResolver);
config.AddApiVersioning();

之后向controller中添加version相关信息,如在下面这个例子中HelloWorld函数将接收并处理利用HTTP Get方法发送给v1.0/heartbeat的请求。欲了解更多相关知识,可访问ASP.NET Web API 2 中的属性路由。

...
using Microsoft.Web.Http;
public class TestController : ApiController
{
    [HttpGet]
    [ApiVersion("1.0")]
    [Route("v{version:apiVersion}/heartbeat")]
    public IHttpActionResult HelloWorld()
    {
        ...
    }
}

 

你可能感兴趣的:(编程及调试)