WebApi初探之路由配置

本文介绍了ASP.NET Web API路由HTTP请求控制器。

如果你熟悉ASP.NET MVC,Web API路由是和MVC路由非常相似的。主要差别是Web API使用HTTP方法而不是URI路径来选择Action的。你也可以使用MVC的路由配置风格来配置Web API路由,当然本文不是来介绍ASP.NET MVC的。

路由表

在ASP.NET Web API,控制器是一种处理HTTP请求的类。控制器的公共方法被称为动作方法或简单的动作。当Web API框架接收请求时,它将请求发送到一个动作。

要确定调用哪个动作,该框架使用路由表。Visual Studio项目模板为Web API创建了一个默认的路由:

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

这个路由在位于App_Start文件夹中的WebApiConfig.cs文件中定义:

如果想要知道更多相关的配置,你可以访问Configuring ASP.NET Web API.

如果是自主机Web API,你必须设置路由表直接在HttpSelfHostConfiguration对象.想知道更多相关信息,请访问Self-Host a Web API.

路由表中的每一个条目包含一个路由模板。Web API默认的路由模板是"api/{controller}/{id}". 在这个模板中, "api"是固定路径量, {controller} 和 {id} 都是预置位变量.

当Web API框架接收到一个HTTP请求,它将尝试匹配URI对路由表中的路由模板。如果没有匹配到,客户端将收到一个404错误。例如,可以用下列地址来匹配默认的路由规则:

  • /api/contacts
  • /api/contacts/1
  • /api/products/gizmo1

但是,下面这个路径将匹配不到,因为它缺少了"api"这个固定路径量:

  • /contacts/1

Note: The reason for using "api" in the route is to avoid                 collisions with ASP.NET MVC routing. That way,                 you can have "/contacts" go to an MVC controller, and "/api/contacts" go to a Web                 API controller. Of course, if you don‘t like this convention, you can change the                 default route table.

Once a matching route is found, Web API selects the controller and the action:

  • To find the controller, Web API adds "Controller" to the value of the                 {controller} variable.
  • To find the action, Web API looks at the HTTP method, and then looks for                 an action whose name begins with that HTTP method name. For example, with a GET request, Web API looks for an action that starts with "Get...",                 such as "GetContact" or "GetAllContacts".  This convention applies only to                 GET, POST, PUT, and DELETE methods. You can enable other HTTP methods by using attributes                 on your controller. We’ll see an example of that later.
  • Other placeholder variables in the route template, such as {id}, are                     mapped to action parameters.

Let‘s look at an example. Suppose that you define the following controller:

public class ProductsController : ApiController
{
    public void GetAllProducts() { }
    public IEnumerable<Product> GetProductById(int id) { }
    public HttpResponseMessage DeleteProduct(int id){ }
}

Here are some possible HTTP requests, along with the action that gets invoked for each:

HTTP Method URI Path Action Parameter
GET api/products GetAllProducts (none)
GET api/products/4 GetProductById 4
DELETE api/products/4 DeleteProduct 4
POST api/products (no match)  

Notice that the {id} segment of the URI, if present, is mapped to the         id parameter of the action. In this example, the controller defines two         GET methods, one with an id parameter and one with no parameters.

Also, note that the POST request will fail, because the controller does not                 define a "Post..." method.

Routing Variations

The previous section described the basic routing mechanism for ASP.NET Web API. This section describes some variations.

HTTP Methods

Instead of using the naming convention for HTTP methods, you can explicitly specify the HTTP method for an action by decorating the action                 method with the HttpGet, HttpPut,                 HttpPost, or HttpDelete attribute.

In the following example, the FindProduct method is mapped to GET requests:

public class ProductsController : ApiController
{
    [HttpGet]
    public Product FindProduct(id) {}
}

To allow multiple HTTP methods for an action, or to allow HTTP methods other than GET, PUT, POST, and DELETE, use     the AcceptVerbs attribute, which takes a list of HTTP methods.

public class ProductsController : ApiController
{
    [AcceptVerbs("GET", "HEAD")]
    public Product FindProduct(id) { }

    // WebDAV method
    [AcceptVerbs("MKCOL")]
    public void MakeCollection() { }
}

Routing by Action Name

With the default routing template, Web API uses the HTTP method to select the action.     However, you can also create a route where the action name is included in the URI:

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

In this route template, the {action} parameter names the action method     on the controller. With this style of routing, use attributes to specify the                 allowed HTTP methods. For example, suppose your controller has the following method:

public class ProductsController : ApiController
{
    [HttpGet]
    public string Details(int id);
}

In this case, a GET request for “api/products/details/1” would map to the Details                 method. This style of routing is similar to ASP.NET MVC, and may be appropriate                 for an RPC-style API.

You can override the action name by using the ActionName attribute.                 In the following example, there are two actions that map to                 "api/products/thumbnail/id. One supports GET and the other supports                 POST:

public class ProductsController : ApiController
{
    [HttpGet]
    [ActionName("Thumbnail")]
    public HttpResponseMessage GetThumbnailImage(int id);

    [HttpPost]
    [ActionName("Thumbnail")]
    public void AddThumbnailImage(int id);
}

Non-Actions

To prevent a method from getting invoked as an action, use the NonAction                 attribute. This signals to the framework that the method is not an action, even                 if it would otherwise match the routing rules.

// Not an action method.
[NonAction]
public string GetPrivateData() { ... }

Further Reading

This topic provided a high-level view of routing. For more detail, see Routing and Action Selection, which describes exactly how the framework matches a URI to a route, selects a controller, and then selects the action to invoke.

原文地址:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

时间: 2024-09-29 03:33:02

WebApi初探之路由配置的相关文章

ASP.NET Core MVC/WebAPi如何构建路由?

前言 本节我们来讲讲ASP.NET Core中的路由,在讲路由之前我们首先回顾下之前所讲在ASP.NET Core中的模型绑定这其中有一个问题是我在项目当中遇见的,我们下面首先来看看这个问题. 回顾ASP.NET Core模型绑定 我们有这样一个场景:修改个人资料中的各个属性,此时每个属性的值的类型肯定是不一样的,所以我们将值定义为object,如下model. public class BlogViewModel { public string prop { get; set; } publi

CIsco动态路由配置之EIGRP

Cisco配置动态路由,可以使用EIGRP(增强型内部网关路由选择协议)进行配置 EIGRP支持: 快速收敛:使用DUAL(弥散更新算法)来实现快速收敛. 带宽的有效利用:发送部分.增量的路由更新而不是发送整个路由表,从而实现带宽的有效利用. 支持多个网络层协议:使用独立于协议的模块(PDM)来支持IP,IPX,Appletalk等协议. 支持VLSM(变长子网掩码)和CIDR(无类域间路由) 思路:分别配置各个路由器的端口IP 使用EIGRP 在各自路由器配置所属的网段 R1#CONF T E

Cisco PT模拟实验(11) 路由器单臂路由配置

Cisco PT模拟实验(11) 路由器单臂路由配置 实验目的: 掌握单臂路由的配置方法 实现不同VLAN之间互相通信 深入理解VLAN通信原理及路由子接口 实验背景: 公司的技术部和销售部分处于不同的办公室,技术部和销售部的PC分处于不同的VLAN,现由于业务的需求需要销售部和技术部的主机能够相互访问,获得相应的资源,两个部门的交换机通过一台路由器进行了连接. 技术原理: VLAN能有效分割局域网,实现各网络区域之间的访问控制.但现实中,往往需要配置某些VLAN之间的互联互通.而实现不同VLA

CCNA网络工程师学习进程(7)路由器的路由配置

    前面一节已经介绍了路由器的端口配置,接着我们介绍路由器的路由配置:静态路由.默认路由和浮动路由的配置:动态路由协议的配置,包括RIP.IGRP.EIGRP和OSPF.     (1)路由器的基础深入: 1)静态路由: 静态路由是指由用户或网络管理员手工配置的路由信息. 静态路由适用于:简单的网络环境和支持DDR(Dial-on-Demand Routing)的网络中. 在DDR(按需拨号路由选择)链路中,拨号链路只在需要时才拨通,因此不能为动态路由信息表提供路由信息的变更情况.DDR允许

MVC路由配置

目录 URL Routing 的定义方式 示例准备 给片段变量定义默认值 定义静态片段 自定义片段变量 自定义片段变量的定义和取值 将自定义片段变量作为Action方法的参数 指定自定义片段变量为可选 定义可变数量的自定义片段变量 路由约束 正则表达式约束 Http请求方式约束 自定义路由约束 定义请求磁盘文件路由 生成URL链接 生成指向当前controller的action链接 生成其他controller的action链接 生成带有URL参数的链接 指定链接的Html属性 生成完整的标准链

路由配置命令

router> enable                    从用户模式进入特权模式router# disable or exit           从特权模式退出到用户模式router# show sessions             查看本机上的TELNET会话router# disconnect                关闭所有的TELNET会话router# show users                查看本机上的用户router# erase startup-

springCloud(14):使用Zuul构建微服务网关-路由端点与路由配置详解

一.Zuul的路由端点 当@EnableZuulProxy与SpringBoot Actuator配合使用时,Zuul会暴露一个路由管理端点/routes.借助这个端点,可以方便.直观地查看以及管理Zuul的路由. /routes端点的使用非常简单,使用GET方法访问该端点,即可返回Zuul当前映射的路由列表:使用POST方法访问该端点就会强制刷新Zuul当前映射的路由列表(尽管路由会自动刷新,Spring Cloud依然提供了强制立即刷新的方式). 由于spring-cloud-starter

实验十一 路由器综合路由配置

实验十一 路由器综合路由配置 一.实验目标 掌握综合路由器的配置方法: 掌握查看通过路由重分布学习产生的路由: 熟悉广域网线缆的链接方式: 二.实验背景 假设某公司通过一台三层交换机连到公司出口路由器R1上,路由器R1再和公司外的另一台路由器R2连接.三层交换机与R1间运行RIPV2路由协议,R1与R2间运行OSPF路由协议.现要做适当配置,实现公司内部主机与公司外部主机之间的相互通信. 三.技术原理 为了支持本设备能够运行多个路由协议进程,系统软件提供了路由信息从一个路由进程重分布到另一个路由

ThinkPHP仿58同城一站多城市路由配置技巧及二级域名部署技巧

ThinkPHP在PATHINFO的URL模式下,URL的格式类似于http://www.domain.com/appName/module/action 即:http://www.domain.com/分组名/模块名/方法名 或者:http://www.domain.com/模块名/方法名 然而在有些类似于58同城这样的应用中,需要分城市展示不同的页面内容,我们希望在网站域名后面紧跟一个城市目录,也即这种格式: http://www.domain.com/城市名/模块名/方法名,根据不同的城市