希望通过本文能够了解如下内容:

  1. ControllerBase
  2. Attributes
  3. Action的返回值类型

ControllerBase

当我们开始实际上项目, 真正实操 anc 时, 肯定会用到 web api 框架和 mvc 框架. 这两个框架自动创建的 controller 继承了不同的父类, web api 创建的 controller 自动继承 controllerBase, mvc 创建的 controller 自动继承 controller, 两个区别是是否支持 views.

官网说了, 如果你的项目准备使用 web api的话, 不要创建一个继承自 controller 的 controller, 因为 controller 是带有一些 view 支持的. 并且 controller 本身也是继承自 controllerbase, 既然你是 web api 的controller, 去 handle web api request, 那么自然是不需要支持 views的, 所以直接使用 controllerbase. 但是有一种情况是例外的, 当你的controller同时想支持 web api 和 views 的时候, 那就继承 controller.

在抽象类 ControllerBase 中, 可以看到绝大多数定义的方法都是 xxxResult 方法. 我们细数一下ControllerBase为我们提供的Result都有哪些:

Result name des
Accepted Result 创建一个status code 为202 accepted 的result作为response返回.
AcceptedAtAction Result 创建一个status code 为202 accepted 的result作为response返回.
AcceptedAtRoute Result 创建一个status code 为202 accepted 的result作为response返回.
BadRequestObject Result Status400BadRequest
Challenge Result 返回身份认证失败的401 unauthorized 和 权限校验失败的 403 forbidden result
ConflictObject Result Status409Conflict
Conflict Result Status409Conflict
Content Result 返回指定的content string作为result
Created Result Status201Created
CreatedAtAction Result Status201Created
CreatedAtRoute Result Status201Created
VirtualFile Result Returns the file specified by virtualPath (Microsoft.AspNetCore.Http.StatusCodes.Status200OK)
FileStream Result Returns a file in the specified fileStream (Microsoft.AspNetCore.Http.StatusCodes.Status200OK)
FileContent Result Returns a file with the specified fileContents as content (Microsoft.AspNetCore.Http.StatusCodes.Status200OK)
ForbidResult 权限校验失败的 403 forbidden result
LocalRedirect Result Creates a Microsoft.AspNetCore.Mvc.LocalRedirectResult object that redirects (Microsoft.AspNetCore.Http.StatusCodes.Status302Found) to the specified local localUrl.
NoContent Result Status204NoContent
NotFoundObject Result Status404NotFound
Ok Result Status200OK
PhysicalFile Result Returns the file specified by physicalPath (Microsoft.AspNetCore.Http.StatusCodes.Status200OK)
Object Result 比较灵活, 需要后端api 开发人员手动指定 status code和问题展示细节等.
Redirect Result Creates a Microsoft.AspNetCore.Mvc.RedirectResult object that redirects (Microsoft.AspNetCore.Http.StatusCodes.Status302Found) to the specified url.
RedirectToAction Result Redirects (Microsoft.AspNetCore.Http.StatusCodes.Status302Found) to an action with the same name as current one. The 'controller' and 'action' names are retrieved from the ambient values of the current request.
RedirectToPage Result Redirects (Microsoft.AspNetCore.Http.StatusCodes.Status302Found) to the specified pageName.
RedirectToRouteResult Redirects (Microsoft.AspNetCore.Http.StatusCodes.Status302Found) to the specified route using the specified routeName, routeValues, and fragment.
SignIn Result 使用指定的身份认证信息创建的登录result
SignOut Result 使用指定的身份认证信息登出系统的result
Object Result 返回指定的code和value作为result
StatusCode Result 返回指定的code作为result
UnauthorizedObject Result Status401Unauthorized
Unauthorized Result Status401Unauthorized
UnprocessableEntityObject Result Status422UnprocessableEntity

基本上很全了. 当我们实际使用时具体需要返回啥样的result, 可以随时去找一个对应合适的result放到response中返回去.

Attributes

除此外, 框架提供了很多 Attribute 用于定义 web api 中 controller 和 action 的行为.

[ApiController]

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

自动生成的 controller 文件头上面还有个标签叫做 [ApiControllerAttribute], 它是用于启动一些专门为了 api 设定的配置.

ApiController 可以定义的位置

  • 如果你的项目中有很多自定义的controller, 但是又不想一个一个都给打上标签, 可以声明一个父类controller, 在这个父类的controller上面打上[ApiController]标签, 并且在父类中定义一些common的method, 自定义的controller可以继承自该父类controller.

  • 除了在controller的上面定义, 还可以在 startup 中定义. 这样做有个问题就是所有的controller都相当于定义了该标签, 无法例外:

    [assembly: ApiController]
    namespace WebApiSample
    {
    public class Startup
    {
    ...
    }
    }

相当于路由的方式必须是标签路由方式

当 controller 上头被定义了该标签后, 表示路由的方式必须是通过标签定义

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

此时通过URL那种转义方式的路由就无法work了. 即我们在 startup.cs文件的configure方法里面通过 seEndpoints, UseMvc, or UseMvcWithDefaultRoute 这些方法定义的默认URL的转义会失效.

自动触发 http 400 code 的response

当 model validation 失败后, 会自动触发 http 400 code 的response, 所以下面的代码在一个 API 的 action 中是多余的:

if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}

如何禁用这一默认行为? 可以在 startup.cs中按照如下进行配置:

services.AddControllers()
.ConfigureApiBehaviorOptions(options =>
{
options.SuppressConsumesConstraintForFormFileParameters = true;
options.SuppressInferBindingSourcesForParameters = true;
options.SuppressModelStateInvalidFilter = true;
options.SuppressMapClientErrors = true;
options.ClientErrorMapping[404].Link =
"https://httpstatuses.com/404";
});

使用[FromBody]参数标签对参数的数据源进行绑定 - model binding

可以在 action 的参数中使用一些参数标签来确定参数的来源.这种操作被称为 model binding, 可以作为 model binding 的参数标签如下:

Attribute Binding source
[FromBody] 从http Request body中获取参数值. 不要在一个action中使用多余一个FromBody标签, 不支持这种操作.
[FromForm] 从httprequest body的form字段中获取参数值.
[FromHeader] 从 http headers 中获取参数值.
[FromQuery] 从query string中获取参数参数值. 但是支持持简单类型的数据获取
[FromRoute] 从当前request的RouteData中获取参数数据参数值. 只支持简单类型的参数(注意当你的values中有可能包含 %2f 时, 不要使用这个标签, 而是使用 [FromQuery], 因为在 [FromRoute] 中 %2f 不会按照理想的方式转义为 /. )
[FromServices] 这种情况是在你的action中使用了其他类的一个实例, 一般来说都是通过依赖注入的方式获取类的实例, 构造函数中注入的话, 可能没有必要. 因为只有这一个方法使用. 所以在参数中添加[FromServices]来获取.

Action的返回值类型

浅谈 asp.net core web api的更多相关文章

  1. List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

  2. ASP.NET Core Web API 跨域(CORS) Cookie问题

    身为一个Web API,处理来自跨域不同源的请求,是一件十分合理的事情. 先上已有的文章,快速复制粘贴,启用CORS: Microsoft:启用 ASP.NET Core 中的跨域请求 (CORS) ...

  3. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

  4. 在ASP.NET Core Web API上使用Swagger提供API文档

    我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...

  5. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  6. 在docker中运行ASP.NET Core Web API应用程序

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

  7. ASP.NET Core Web API Cassandra CRUD 操作

    在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将 ...

  8. 在Mac下创建ASP.NET Core Web API

    在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...

  9. ASP.NET Core Web API 开发-RESTful API实现

    ASP.NET Core Web API 开发-RESTful API实现 REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representa ...

随机推荐

  1. Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记

    目录 二进制Metrics&Dashboard安装 二进制高可用集群可用性验证 生产环境k8s集群关键性配置 Bootstrapping: Kubelet启动过程 Bootstrapping: ...

  2. python numpy 数据集合操作函数

    arrarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])arr1array([0, 1, 2, 3, 4])np.intersect1d(arr,arr1)#计算数组ARR A ...

  3. VUE+ElementUI实现左侧为树形结构、右侧无层级结构的穿梭框

    工作中遇到一个需求,需要将一个数据选择做成穿梭框,但是要求穿梭框左侧为树形结构.右侧为无层级结构的数据展示,ElementUI自身无法在穿梭框中添加树形结构,网上搜到了大佬封装的插件但是对于右侧的无树 ...

  4. Java基础00-学生管理系统16

    1. 学生管理系统 1.1 项目演示 1.2 实现思路 1.3 定义学生类 public class Student { private String sid; private String name ...

  5. [善用佳软]Chrome插件之彩云小译

    最近公众号新推出个栏目[善用佳软],旨在和大家分享各种小插件和制作开源小软件. 最近在浏览外网时,发现一个贼好用的翻译神器---[彩云小译],在网页端就可以快速的对照翻译出来,经过试用发现无论是速度还 ...

  6. Python基础之函数的闭包与装饰器的介绍

    1.闭包的概念: 如果在一个函数中,定义了另外一个函数,并且那个函数使用了外面函数的变量,并且外面那个函数返回了里面这个函数的引用,那么称为里面的这个函数为闭包. 2.话不多说,以demo示例: de ...

  7. UI自动化学习笔记- PO模型介绍和使用

    一.PO模型 1.PO介绍:page(页面) object(对象) 在自动化中,Selenium 自动化测试中有一个名字经常被提及 PageObject (思想与面向对象的特征相同),通常PO 模型可 ...

  8. vue tab实现右定位

    呈现效果 利用v-if进行判断,登页面完全加载完毕后,显示tab页, 利用name标签,实现选择哪个tab <template> <el-tabs v-if="displa ...

  9. odoo里面批量上传图片

    import os import base64 def base_data_product_image(self): """ odoo里批量创建产品,并上传图片 图片为b ...

  10. 前端构建第1篇之---引入elementUI

    张艳涛 写于2021-1-19 HOW:如何引入elementui? 在项目根目录package.json引入,在重新执行npm install "dependencies": { ...