前言

新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力。

新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马。

作者认为新人应该先打好基础,不要直接学习框架,例如先掌握 SQL 再使用 EFCore 框架。

作者只传授数年内不会变化的知识,让新手学习快速进入跑道受益终身。

分享使我快乐,请务必转发给同学,朋友,让大家都少走一些弯路!!


到此你已经初步掌握了 HTTP 协议,C# 语言基础知识,这一篇将带你进入 WebApi 服务器应用开发的环境。

对于 Web 服务端程序来讲,一般分两种请求内容,静态和动态:

  • 静态的内容比如 .html/.css/.jpg,他们一般会存放在固定的 web 目录之内
  • 动态的内容比如查询投票数量、发表博客文章

Asp.net core 框架入门

Asp.net core 框架,它是官方为数不多的优秀框架,其实蛮复杂不建议新手进行系统的全面学习,如果有条件甚至推荐先学习 expressjs 框架(nodejs)再来看 Asp.net core 会简单很多。

创建一个 WebApi 程序很简单,在控制台使用命令:

dotnet new webapi


然后你就可以 F5 运行项目了,快点打开 ide 试试吧!

  • AddControllers/MapControllers 应用 Controllers 目录下的控制台类
  • AddSwaggerGen/UseSwagger/UseSwaggerUI 应用 Swagger 接口管理器,你可以把它发给前端开发者,提供了哪些 HTTP 接口一目了然


Controller 控制器

  • WeatherForecastController 继承 ControllerBase
  • [Route("[controller]")] 注解指定 HTTP 请求的路径是 WeatherForecast
  • Get 方法 [HttpGet("GetWeatherForecast")] 指定 HTTP 请求的方法为 GET,最终请求的路径是 WeatherForecast/GetWeatherForecast
  • Get 方法返回值最终被序列化成 Json 格式返回给浏览器


思考:如果使用 [HttpPost] 是不是指定方法为 POST?

[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
}; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
} [HttpGet("GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}

之前讲 HTTP 协议时,有讲到 QueryString、Form、JSON 三种请求报文的参数格式,服务器获取参数的办法:

    [HttpGet("QueryString")]
public string QueryStringTest([FromQuery] int id, [FromQuery] string wd)
{
return id.ToString() + ", " + wd;
} [HttpPost("Form")]
public string FormTest([FromForm] int id, [FromForm] string wd)
{
return id.ToString() + ", " + wd;
} [HttpPost("JSON")]
public string JsonTest([FromBody] JsonTestInputModel json)
{
return json.id.ToString() + ", " + json.wd;
}
class JsonTestInputModel
{
public int id { get; set; }
public string wd { get; set; }
}

关于异步,建议先把同步熟练之后再学习不迟,混起来学机制不明白还容易乱用。


什么是依赖注入(Denpendency Injection)

到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control),DI等概念搞晕。

1、首先我们得知道什么是依赖

当一个类需要另一个类协作来完成工作的时候就产生了依赖。比如我们在AccountController这个控制器需要完成和用户相关的注册、登录 等事情。其中的登录我们由EF结合Idnetity来完成,所以我们封装了一个EFLoginService。这里AccountController就有一个ILoginService的依赖。

2、什么是注入

注入体现的是一个IOC(控制反转的的思想)。在反转之前 ,我们先看看正转。

private ILoginService<ApplicationUser> _loginService;
public AccountController()
{
_loginService = new EFLoginService()
}

大师说,这样不好。你不应该自己创建它,而是应该由你的调用者给你。于是你通过构造函数让外界把这两个依赖传给你。

private ILoginService<ApplicationUser> _loginService;
public AccountController(ILoginService<ApplicationUser> loginService)
{
_loginService = loginService;
}

把依赖的创建丢给其它人,自己只负责使用,其它人丢给你依赖的这个过程理解为注入。

3、为什么要反转?

为了在业务变化的时候尽少改动代码可能造成的问题。比如我们现在要把从EF中去验证登录改为从Redis去读,于是我们加了一个 RedisLoginService。这个时候我们只需要在原来注入的地方改一下就可以了。

因为EFLoginService和RedisLoginService都实现了接口ILoginService,所以我们直接在调用方传入RedisLoginService即可。(即将EFLoginService替换为RedisLoginService)

4、什么是容器?

上面我们在使用AccountController的时候,我们自己通过代码创建了一个ILoggingServce的实例。想象一下,一个系统中如果有100个这样的地方,我们是不是要在100个地方做这样的事情? 控制是反转了,依赖的创建也移交到了外部。现在的问题是依赖太多,我们需要一个地方统一管理系统中所有的依赖,所以容器诞生了。

容器负责两件事情:

  • 绑定服务与实例之间的关系
  • 获取实例,并对实例进行管理(创建与销毁)


Asp.net core DI

在.NET Core 中 DI 的核心分为两个组件:IServiceCollection和 IServiceProvider。

  • IServiceCollection 负责注册
  • IServiceProvider 负责提供实例
builder.Services
//.AddTransient<ILoginService, EFLoginService>() //每一次GetService都会创建一个新的实例
.AddScoped<ILoginService, EFLoginService>() //在同一个Scope内只初始化一个实例
//.AddSingleton<ILoginService, EFLoginService>(); //整个应用程序生命周期以内只创建一个实例

提示:每个 HTTP 请求都会创建一个 Scope 生命范围,所以 AddScoped 是最常用的方法。

public class WeatherForecastController : ControllerBase
{
private readonly ILoginService _loginService; public WeatherForecastController(ILoginService loginService)
{
_loginService = loginService;
}
}

中间件管道

app.Use(async (context, next) =>
{
Console.WriteLine("middleware1 : in");
await next.Invoke();
Console.WriteLine("middleware1 : out");
});
app.Use(async (context, next) =>
{
Console.WriteLine("middleware2 : in");
await next.Invoke();
Console.WriteLine("middleware2 : out");
});
app.Run(async context =>
{
Console.WriteLine("Hello World");
await context.Response.WriteAsync("Hello World");
});


Asp.net core 框架还有很多知识,但是对新手而已学到这里算入门了,千万不要指望一下能吃下所有内容(贪吃蛇的后果),只有反复的实战才能彻底领会贯通。

到这里,你已经对 Asp.net core 框架有了初步的认识,为我们以后深入打下了基础,下一篇我们学习 数据库 CRUD 增删改查 知识吧!


系列文章导航

原创保护,转载请注明出处:https://www.cnblogs.com/FreeSql/p/16782488.html

Asp.net core 少走弯路系列教程(七)WebApi 学习的更多相关文章

  1. 学习ASP.NET Core Razor 编程系列九——增加查询功能

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  2. 学习ASP.NET Core Razor 编程系列十九——分页

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. 学习ASP.NET Core Razor 编程系列十七——分组

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. 学习ASP.NET Core Razor 编程系列十六——排序

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  6. 学习ASP.NET Core Blazor编程系列十五——查询

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  7. 学习ASP.NET Core Blazor编程系列十六——排序

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...

  8. 学习ASP.NET Core Razor 编程系列八——并发处理

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. 学习ASP.NET Core Razor 编程系列十——添加新字段

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  10. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

随机推荐

  1. 一个登录功能也能玩出这么多花样?sa-token带你轻松搞定多地登录、单地登录、同端互斥登录

    需求场景 说起登录,你可能会不屑一顾,还有比这更简单的功能吗? 获取一下用户提交参数 username + password 和数据库中一比对,有记录返回[登录成功],无记录返回[用户名或密码错误] ...

  2. Pyinstaller打包工具

    本篇博客主要介绍的是pyinstaller在windows下的基本使用和基础避坑 在windows中使用pyinstaller工具打包时会出现一个问题,在打包列表会看到这样的警告信息: django. ...

  3. Frp内网穿透(一)

    ftp简介 frp frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https协议. 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https ...

  4. 考拉 T_Q_X 的博客搬运(搬运)

    博客搬迁现场直播 各位观众们大家好,欢迎来到新闻透视 今天为您直播某菜鸡oier tqx 的博客搬迁现场. Q:请问tqx,您为什么要将博客从CSDN搬迁到博客园呢? tqx:懂得都懂,不懂的我也不多 ...

  5. 无分类有tag

    1 2

  6. IDEA 常见设置

    一.字体设置 二.自动导入java包和自动清除无用的引用 清除无用的import包手动快捷键:Ctrl + Alt + O 添加引用在代码中光标指向需要添加引用的上,然后使用快捷键:Alt+Enter ...

  7. 面试题53 - II. 0~n-1中缺失的数字

    地址:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/ <?php /** 一个长度为n-1的递增排序数组中的所有数字都是唯一的, ...

  8. 提供一个纯C语言的图像压缩程序,但是要达到将6MB的图片压缩到100KB以内的要求,有损压缩肯定是必须的。同时,要在速度上有所提升,我可以为您提供一个基于多线程的图像压缩程序。

    提供一个纯C语言的图像压缩程序,但是要达到将6MB的图片压缩到100KB以内的要求,有损压缩肯定是必须的.同时,要在速度上有所提升,我可以为您提供一个基于多线程的图像压缩程序. 首先,我们需要了解一下 ...

  9. FastAPI Cookie 和 Header 参数完全指南:从基础到高级实战 🚀

    title: FastAPI Cookie 和 Header 参数完全指南:从基础到高级实战 date: 2025/3/9 updated: 2025/3/9 author: cmdragon exc ...

  10. 多机器的键鼠互通——Synergy/Deskflow配置记录

    Synergy (1.14.6) 情况一样,那么感觉就是机器之间TCP连接有问题,测试不同 一些测试命令 ss -tlnp | grep 24800 # 查看端口情况 sudo lsof -i :24 ...