C#进阶:WebApi路由与性能优化

需积分: 45 6 下载量 143 浏览量 更新于2024-08-08 收藏 3.21MB PDF 举报
本文档是关于C# WebApi技术的系列教程,涵盖了WebApi路由机制、异常处理、接口返回值类型以及接口参数的详细解析。 ### WebApi路由基础 WebApi路由是决定如何将HTTP请求映射到特定的控制器和操作的重要机制。默认情况下,WebApi使用一种约定式路由策略,即`api/{controller}/{id}`,其中`{controller}`代表控制器名,`{id}`通常是操作方法的参数。 #### 1、默认路由 默认路由模板为`api/{controller}/{id}`,如请求`/api/products/1`会映射到`ProductsController`中的`Get(int id)`方法。`id`参数是可选的,如果不存在,它可以在操作方法中声明为`null`或使用`[FromUri]`注解来处理。 #### 2、自定义路由 自定义路由允许开发人员根据需求定制更复杂的路由规则。例如,可以创建一个路由模板`api/{category}/{product}/{action}`,使得URL结构更符合业务逻辑。 - **自定义路由一:匹配到action** 可以通过指定`Route`属性来自定义路由,如`[Route("api/[controller]/[action]")]`,这样URL将直接包含控制器和操作名。 - **自定义路由二** 还可以指定参数,如`[Route("api/[controller]/{productId}/actions/{action}")]`,这会匹配形如`/api/Products/123/actions/details`的URL。 ### 路由原理 路由引擎首先匹配URL路径,然后解析出控制器和方法名。如果找不到匹配的路由,WebApi会返回404错误。 ### WebApi路由过程 1. **根据请求的URL匹配路由模板** WebApi会遍历注册的路由模板,尝试与请求的URL相匹配。 2. **找到控制器** 匹配成功后,根据模板中的`{controller}`占位符确定控制器类。 3. **找到action** 使用`{action}`占位符或默认的`Get`、`Post`等方法名寻找执行的操作。 ### 特性路由 特性路由是一种更直观的路由方式,通过在控制器或操作方法上直接添加`[Route]`属性进行定义。 #### 1、启动特性路由 启用特性路由需要在`WebApiConfig`中进行配置,以替代或补充默认路由。 #### 2、最简单的特性路由 `[Route("api/[controller]")] `[HttpGet]` `[Route("get/{id}")]` 这样的组合会在`/api/Products/get/1`上找到`ProductsController`的`Get(int id)`方法。 #### 3、带参数的特性路由 可以添加参数到路由模板,如`[Route("api/products/{categoryId}/{productId}")]`。 #### 4、参数的约束和默认值 可以通过`{param:[constraint]}`设置约束,`{param:guid}`表示参数应为Guid类型。默认值使用`{param=defaultValue}`。 #### 5、路由前缀 可以使用`[RoutePrefix("api/v1")]`为一组路由添加共享的前缀。 ### Restful风格的WebApi服务 构建RESTful API时,通常使用HTTP动词(GET、POST、PUT、DELETE等)对应不同的操作。 ### 异常处理 WebApi提供了多种方式来捕获和处理异常,包括异常筛选器、控制器级别的处理和全局配置。 ### 接口返回值 WebApi支持多种返回值类型,如`void`、`IHttpActionResult`、`HttpResponseMessage`和自定义类型。 #### 1、void无返回值 用于没有返回值的操作。 #### 2、IHttpActionResult 这是WebApi推荐的返回类型,可以方便地返回各种HTTP状态码和数据。 - `Json<T>`返回JSON格式的数据。 - `Ok<T>`表示请求成功并返回数据。 - `NotFound()`表示未找到资源。 - `Content<T>`用于返回自定义HTTP状态码和数据。 - `BadRequest()`表示客户端请求有误。 #### 3、HttpResponseMessage 直接返回HTTP响应消息,可以自定义更精细的控制。 #### 4、自定义类型 可以直接返回自定义类型的对象,WebApi会自动将其序列化。 ### 接口参数 #### 1、get请求参数 - 基础类型和实体类型作为查询字符串参数。 - 数组参数也可以作为查询字符串。 - 特殊情况下,控制器名称以get开头或不以get开头会影响路由解析。 #### 2、post请求参数 - 基础类型参数可以通过请求正文传递。 - 错误的写法可能会导致数据丢失,正确做法是使用`FromBody`注解。 ### 总结 本教程深入探讨了WebApi的核心组件,包括路由机制、异常处理、返回值类型以及参数处理,旨在帮助开发者更好地理解和利用WebApi构建高效、可维护的API服务。
2024-11-29 上传