2.1 .net 8 ASP.NET Core Web API - Controller详解

这篇具有很好参考价值的文章主要介绍了2.1 .net 8 ASP.NET Core Web API - Controller详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

书接上回,上节我们留了几个问题,即:

1、接口Hello的名字究竟怎么来的?

2、我们如果想把接口改成其他的名称,应该怎么做?

3、我们继承ControllerBase,以及[Route(“[controller]”)]属性,又是分别起到什么作用?

需要解决以上几个问题,我们就要继续深入研究Controller相关的一些东西,主要包括ControllerBase基类、ApiController 属性,我们想要精通某个技术,必须要了解器原理,才能做到触类旁通、灵活运用。

.net8 webapi 权限控制,.net 8 web api 教程,从0开始,前端,.net,asp.net

ControllerBase 是Web API 控制器的基类,换句话说,Web API 控制器通常都应继承 ControllerBase。做过MVC项目的朋友可能都知道,在MVC里面控制器一般继承Controller。两者有什么关系和区别吗?

二、ControllerBase

1、ControllerBase基类和Controller基类的关系

查看ControllerBase 的定义,这是一个抽象类;
.net8 webapi 权限控制,.net 8 web api 教程,从0开始,前端,.net,asp.net

再看Controller的定义,其继承了ControllerBase

.net8 webapi 权限控制,.net 8 web api 教程,从0开始,前端,.net,asp.net
两者的关系是:Controller基类派生自ControllerBase

2、ControllerBase基类和Controller基类的区别

Controller 派生自 ControllerBase,主要区别是Controller 功能更强大,主要添加对视图的支持,因此它用于处理 Web 页面,而不是 Web API 请求。 如果同一控制器需要同时支持视图和 Web API,那应该派生自 Controller。如果仅仅需要支持 Web API,那就派生自 ControllerBase即可,这样更加轻量级。

3、ControllerBase作用

ControllerBase 类主要作用是提供了很多用于处理 HTTP 请求的属性和方法。比如我们可以通过这个基类提供的Request属性获取请求头信息:

// 获取请求头
 var headers = this.Request.Headers;
 foreach (var kvp in headers)
 {
     Console.WriteLine($"{kvp.Key} : {kvp.Value}");
 }

运行结果可以看到我们把请求头的全部信息都获取到了
.net8 webapi 权限控制,.net 8 web api 教程,从0开始,前端,.net,asp.net

有关ControllerBase 可用方法和属性的列表,具体不展开,可参考官方文档。

三、[ApiController]属性

作用:[ApiController] 属性应用于控制器类,让控制器上或该控制器下的的API具有以下几个固定的功能

(1)、属性路由要求
(2)、自动 HTTP 400 响应
(3)、绑定源参数推理
(4)、Multipart/form-data 请求推理
(5)、错误状态代码的问题详细信息
下面分别阐述

1、属性路由要求

先介绍 ASP.NET Core 中的路由的两种方式 传统路由属性路由

传统路由实现方式:

// 在Program.cs中或Startup.cs中使用
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

或者

// 在Program.cs中或Startup.cs中使用
app.MapDefaultControllerRoute();

属性路由的实现方式:

// 在Program.cs中或Startup.cs中使用
app.MapControllers();

然后在Controller中使用[Route(“”)]属性指定路由名称,如示例代码:

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

介绍完了两种路由,再来看什是属性路由要求?

所谓属性路由要求,意思就是如果Controller加了[ApiController]属性,就必须走属性路由的方式。这也就能解释示例代码Controller上存在[ApiController][Route(“[controller]”)]这两个属性。

2、自动 HTTP 400 响应

什么是http 400?比如我们对用户注册的手机号码格式有校验要求,手机号码格式不正确时候,这个时候参数校验就会不通过,需要写如下代码。

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

[ApiController] 属性使模型验证错误自动触发 HTTP 400 响应。 因此,操作方法中不需要上述代码。

3、绑定源参数推理

我们获取参数的时候,有以下一些绑定源:

[FromBody] 请求正文
[FromForm] 请求正文中的表单数据
[FromHeader] 请求标头
[FromQuery] 请求查询字符串参数
[FromRoute] 当前请求中的路由数据
[FromServices] 作为操作参数插入的请求服务
[AsParameters] 方法参数

[ApiController] 属性借助推理规则,无需手动识别绑定源。先大概描述下,后续在参数传递和绑定章节再详细展开这些规则。

4、Multipart/form-data 请求推理

[ApiController] 属性针对 IFormFile 和 IFormFileCollection 类型的操作。 为这些类型自动推断内容类型为: multipart/form-data。不需要人工在请求Header头上指定类型。

5、错误状态代码的问题详细信息

错误结果(状态代码>= 400)以ProblemDetails展示。
ProblemDetails的定义如下:
.net8 webapi 权限控制,.net 8 web api 教程,从0开始,前端,.net,asp.net
看怎么使用:
比如有如下的代码,抛出一个404 NotFound的异常

if (pagePath == null)
{
    return NotFound();
}

NotFound 方法会生成带 ProblemDetails 正文的 HTTP 404 状态代码。 例如:

{
  type: "https://tools.ietf.org/html/rfc7231#section-6.5.4",
  title: "Not Found",
  status: 404,
  traceId: "0HLHLH32KRN20:00000001"
}

小结

以上5点就是[ApiController]属性起到的作用,接下来我们来介绍[RouteAttribute]属性的作用。

四、[RouteAttribute]属性

其实上面属性路由环节基本已经介绍了这个属性,这个属性的作用就是:指定控制器上的属性路由

包含三个属性:

Name :路由名称。

Order :路由执行的顺序。

Template :路由模板。 可为 null。

其中,最关键的Template ,一般通过Template指定接口的访问路径,比如:

[Route(“/route/norest/{name?}/”)]

五、解决上节遗留问题

有了这些基础知识,我们来解决上节遗留的问题:

1、接口Hello的名字究竟怎么来的?

答:接口Hello的名字是根据下面代码有关

[Route("[controller]")]
 public class HelloController : ControllerBase

因为Controller的名称为Hello,根据restful API规范,Controller里面又只有一个Get请求的接口,故Action的定义没有影响到接口的最终名称。

2、我们如果想把接口改成其他的名称,应该怎么做?
答:修改成如下代码即可,比如改成Greeting

 [ApiController]
 [Route("")]
 public class HelloController : ControllerBase
 {
    [HttpGet("Greeting",Name = "GetHello")]
     
     public string Hello()
     {   
         return "Hello,World!";
     }
 }

有两处改动,去除Controller的Route名称,改为空字符串,然后给Hello方法指定Template(注:HttpGet可以直接指定Template )。

运行结果如下:
.net8 webapi 权限控制,.net 8 web api 教程,从0开始,前端,.net,asp.net
可以看到,名称已经修改成功。

3、我们继承ControllerBase,以及[Route(“[controller]”)]属性,又是分别起到什么作用?

答:这个上面都有详细描述了

六 、总结

本节的目标主要讲述controller相关的一些知识,再解决第1个问题的过程中,出现了一个restful API规范的概念,以及在路由环节的介绍基本也是带过,下节我们将深入路由环节,揭开它的神秘面纱。

敬请期待…文章来源地址https://www.toymoban.com/news/detail-828395.html

到了这里,关于2.1 .net 8 ASP.NET Core Web API - Controller详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ASP.NET Core Web API 流式返回,逐字显示

    Websocket、SSE(Server-Sent Events)和长轮询(Long Polling)都是用于网页和服务端通信的技术。 Websocket是一种全双工通信协议,能够实现客户端和服务端之间的实时通信。它基于TCP协议,并且允许服务器主动向客户端推送数据,同时也允许客户端向服务器发送数据。 SSE是一种单向

    2023年04月23日
    浏览(38)
  • ASP.NET Core Web API入门之三:使用EF Core

    一般来讲我们做项目都会用实体类跟数据库实体进行关系对应,这样的好处方便我们维护、增删改查,并且可以减少SQL的编写,从而统一风格,那么 Entity Framework Core 就是很不错的ORM框架。 1、跨数据库支持能力强大,只需修改配置就可以轻松实现数据库切换。 2、提升了开发效

    2024年02月10日
    浏览(39)
  • 在 ASP.NET Core Web API 中处理 Patch 请求

    PUT 和 PATCH 方法用于更新现有资源。 它们之间的区别是,PUT 会替换整个资源,而 PATCH 仅指定更改。 在 ASP.NET Core Web API 中,由于 C# 是一种静态语言( dynamic 在此不表),当我们定义了一个类型用于接收 HTTP Patch 请求参数的时候,在 Action 中无法直接从实例中得知客户端提供了哪

    2024年02月04日
    浏览(33)
  • 如何将.NET 8.0的ASP.NET Core Web API部署成Windows服务

    前面写了一篇关于将.NET应用转换成Windows服务的方法,其实真正的目的是为了探索如何将Asp.Net Core Web Api 部署成Windows 服务。基于上一篇的基础,只需把创建 WebApplication 的代码放到 BackgroundService 的ExecuteAsync方法中即可。 其中比较重要的一个细节就是需要指定一下配置:    

    2024年01月17日
    浏览(35)
  • 1.2 .net 8 ASP.NET Core Web API 项目创建之 Hello,World

    上一节演示了如何创建一个新的Web API 项目,并展示了如何运行及测试接口,这节的主要目标是增加一个hello的接口,接口返回内容为“Hello,World!”,在添加接口之前,我们先要对上一节的项目进行分析,只有了解项目的结构,才能知道怎么去添加新的接口和扩展新的功能。

    2024年01月20日
    浏览(34)
  • ASP.NET Core SingleR Core:WebApi + .net 客户端开发

    我之前稍微研究了一下SignalR Core。用起来还行。简单来说SignalR就是用来解决实时通讯的问题的。 ASP.NET Core SingleR:初次体验和简单项目搭建 SignalR支持三种客户端,C#,Java,JavaScirpt。基本够用了。本身就是微软开发的,肯定支持自己的语言。因为是Websocket的上层封装,所以也要支

    2024年01月20日
    浏览(50)
  • ASP.NET Core 中基于 Minimal APIs 的Web API

    Minimal APIs 是ASP.NET Core中快速构建 REST API 的方式,可以用最少的代码构建全功能的REST API。比如下面三行代码: 可以实现在请求网站根目录结点的时候,返回\\\"Hello World!\\\"。 这种方式的Web API可以用于构建微服务,极简功能的网站。 下面代码,将几个 HTTP 请求的 url映射到 Lambda

    2024年02月10日
    浏览(31)
  • ASP.NET Core Web API 流式返回,实现ChatGPT逐字显示

    🏆作者:科技、互联网行业优质创作者 🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 🏆欢迎关注我(Net数字智慧化基地),里面有很多 高价值 技术文章, 是你刻苦努力也积累不到的经验 ,能助你快速成长。升职

    2024年02月22日
    浏览(41)
  • ASP.NET Core 的 Web Api 实现限流 中间件

    Microsoft.AspNetCore.RateLimiting  中间件提供速率限制(限流)中间件。 它是.NET 7 以上版本才支持的中间件,刚看了一下,确实挺好用,下面给大家简单介绍一下: RateLimiterOptionsExtensions 类提供下列用于限制速率的扩展方法:​​​​​ 固定窗口限制器 滑动窗口限制器 令牌桶限

    2024年01月17日
    浏览(28)
  • .net 温故知新【14】:Asp.Net Core WebAPI 缓存

    缓存指在中间层中存储数据的行为,该行为可使后续数据检索更快。 从概念上讲,缓存是一种性能优化策略和设计考虑因素。 缓存可以显著提高应用性能,方法是提高不常更改(或检索成本高)的数据的就绪性。 在最新的缓存控制规范文件RFC9111中,详细描述了浏览器缓存和

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包