N

.NET Core 3.1 Web API 和实体框架快速入门 - 第 1 部分 Web API 核心简介

2025-05-28

.NET Core 3.1 Web API 和实体框架快速入门 - 第一部分

介绍

Web API 核心

本系列教程现已提供在线视频课程。您可以在 YouTube 上观看第一个小时的课程,或在 Udemy 上获取完整课程。您也可以继续阅读。尽情享受吧!:)

介绍

如今,.NET Core 框架在 Web 开发领域越来越完善,也越来越重要。

我收到的几乎每个新 Web 开发项目请求都要求了解 .NET Core 方面的知识,包括 Web API 和 Entity Framework Core。

因此,了解使用 .NET Core 进行后端 Web 开发的基础知识,对你的职业生涯大有裨益。而这正是本系列教程的用武之地。

在短时间内,您将学习如何设置 Web API、调用此 Web API 以及如何使用 Entity Framework Core和Code First Migration的帮助持久保存数据

我们将直奔主题,您将看到编写必要代码的每个步骤,并且在本教程系列结束时,您将有能力对任何招聘人员的所有 .NET Core 项目请求说“是”。

您一开始唯一需要的工具是Visual Studio CodePostman - 两者都是免费提供的。

我们将使用 Visual Studio Code 进行实现,并使用 Postman 调用 Web API。这两款工具均适用于 Windows、Mac OS 和 Linux。由于 .NET Core 是跨平台的,您可以在任何操作系统上学习本系列教程。(我知道,微软和跨平台,这仍然让我感到惊讶。)

我们要构建的后端应用程序是一个基于文本的小型角色扮演游戏,不同的用户可以注册(我们将使用JSON 网络令牌进行身份验证)并创建自己的角色,如法师或骑士,更新这些角色的属性,设置技能,还可以让角色相互战斗,看看谁更优秀。

所以,我希望你已经准备好学习新技能,迎接新项目。我们开始吧!

工具

目前我们只需要 Visual Studio Code 和 Postman。此外,您还需要下载并安装 .NET Core 3.1 SDK。

VS Code 可在https://code.visualstudio.com/上找到。Postman可在https://www.getpostman.com/
上找到。SDK可在https://dotnet.microsoft.com/download 上下载。请确保下载适用于你的操作系统的.NET Core 3.1 。

因此请下载并安装所有内容,然后继续下一章。

创建新的 Web API

一旦安装了 .NET Core SDK、Visual Studio Code 和 Postman,我们就可以立即创建我们的第一个 .NET Core 应用程序,它将是一个 Web API。

首先,我创建了一个名为“dotnet-rpg”的新文件夹,用于存放“dotnet 角色扮演游戏”。在 VS Code 中打开该文件夹。

我假设你已经对 Visual Studio Code 有点熟悉了,如果不熟悉,请随意浏览一下。

当你这样做时,安装某些扩展可能也是一个好主意。

微软自家推出的首个“适用于 Visual Studio Code 的 C# ”扩展。当您创建第一个 C# 应用程序时,VS Code 也会立即推荐此扩展。它包含编辑支持、语法高亮、智能感知、跳转到定义、查找所有引用等功能,只需简单了解一下,就足以说明它非常实用。

接下来是 jchannon 的“ C# 扩展”。正如描述所说,在上下文菜单中添加一些条目(例如添加新的 C# 类或接口)可能会加快开发工作流程。

最后一个已经是我个人最喜欢的主题之一了,“ Material Icon Theme ”。它提供了大量可爱的图标。

好了,现在让我们创建我们的 Web API!我们打开一个新的终端窗口,然后看看dotnet命令提供了什么。

添加后,-h您将看到所有可用的命令。我们现在感兴趣的是new创建新 .NET 项目的命令。

但我们也有run运行应用程序的命令,以及watch可以与此命令一起使用的命令,run以便在对任何文件进行更改时立即重新启动应用程序。如果你不想每次进行任何更改后都手动停止并重新启动项目,那么这非常有用。

我们dotnet new -h看到了所有可用的模板。有很多。例如,普通的控制台应用程序,以及更进一步,我们终于找到了 Web API。那就开始使用吧!

.NET Core 模板

我们输入dotnet new webapi并按回车键。

现在我们在资源管理器中看到了一些生成的文件。让我们快速浏览一下它们。

替代文本

在底部,我们看到了WeatherForecast类。这只是默认 Web API 项目的一部分。我们实际上并不需要它,但我们稍后会用到这个示例。

与此同时,我们弹出一个小窗口,提示我们需要添加一些文件。当然,我们想添加它们。

添加必要的文件弹出窗口

现在你应该能看到,我们得到了一个.vscode包含launch.json和 的文件夹tasks.json。这两个文件都是用于调试、源代码格式化程序、打包程序等的配置文件,但目前我们对此还不是很感兴趣。

新添加的文件

那么让我们看一下这个Startup课程。

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
Enter fullscreen mode Exit fullscreen mode

这里我们找到了ConfigureServicesConfigure方法。 它ConfigureServices配置了应用的服务,因此它是一个提供应用功能的可复用组件。我们将来会在这个方法中注册服务,这样我们就可以通过依赖注入等方式在我们的 Web 服务中使用它们。

请不要介意现在的这些流行语......

Configure方法创建应用的请求处理管道,这意味着该方法用于指定应用如何响应 HTTP 请求。如您所见,我们使用了HttpRedirectionRouting等等。通过所有这些Use...扩展方法,我们将中间件组件添加到请求管道中。例如,UseHttpRedirection添加用于将 HTTP 请求重定向到 HTTPS 的中间件。

为了使我们一开始就更容易一些,让我们删除该UseHttpRedirection行或至少将其注释掉。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    //app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
Enter fullscreen mode Exit fullscreen mode

该类Startup是在构建应用主机时指定的。您可以在方法Program中的类中看到它CreateHostBuilder()。这里Startup通过调用方法指定了类UseStartup()

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}
Enter fullscreen mode Exit fullscreen mode

在该文件中,.csproject我们可以看到 SDK、目标框架(在本例中为 .NET Core 3.1)以及根命名空间。稍后,我们将在此文件中找到其他包,例如 Entity Framework Core。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>dotnet_rpg</RootNamespace>
  </PropertyGroup>


</Project>
Enter fullscreen mode Exit fullscreen mode

关于appsettings.json文件我们只需要知道我们可以在这里添加和修改一些配置。

现在更有趣的是launchSettings.json配置当前环境的文件以及应用程序的URL。通过这个URL,我们可以找到正在运行的Web服务。

"dotnet_rpg_3._1": {
  "commandName": "Project",
  "launchBrowser": true,
  "launchUrl": "weatherforecast",
  "applicationUrl": "https://localhost:5001;http://localhost:5000",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
}
Enter fullscreen mode Exit fullscreen mode

obj文件bin夹暂时可以忽略。我们在这里找到临时目标文件和最终二进制文件。

文件夹非常有趣,并且在本系列教程中经常使用Controllers。您在这里看到的第一个控制器是生成的WeatherForecast演示控制器。我们稍后会详细介绍控制器。现在,我们只需要知道,我们已经可以Get()在这里调用该方法了。

[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
    var rng = new Random();
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast
    {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = rng.Next(-20, 55),
        Summary = Summaries[rng.Next(Summaries.Length)]
    })
    .ToArray();
}
Enter fullscreen mode Exit fullscreen mode

第一次 API 调用

在终端中,我们输入dotnet run。你看,这里已经是我们在 中看到的 URL 了launchSettings.json。所以,让我们打开 Chrome 并转到http://localhost:5000

dotnet 运行结果

嗯,这个 URL 的结果看起来不太好。这是因为我们必须访问WeatherForecast控制器。所以,当我们回到 VS Code 时,我们会看到控制器的名称(WeatherForecast不带 的 - Controller)。我们还会看到路由属性([Route"[controller]"]),它定义了如何访问这个控制器——我们将在以后的章节中讨论路由的工作原理。

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
// ...
Enter fullscreen mode Exit fullscreen mode

因此,我们只需复制名称 - WeatherForecast - 返回 Chrome,输入正确的路线,最后即可获得结果。

Chrome 中的 WeatherForecast 结果

我们还可以在控制台中看到结果。

控制台中的 WeatherForecast 结果

现在让我们使用 Postman 来执行此操作,因为 Postman 将是我们用来测试 Web API 的 REST 调用的工具。

如果您还不熟悉 Postman,请先熟悉一下。

关键部分在中间。我们可以选择HTTP 请求方法(在本例中是HTTP 请求方法GET),然后输入 URL 并点击“发送”。

结果的样式应该看起来与控制台类似。

Postman 中的 WeatherForecast 结果

太棒了!看来成功了。现在我们继续构建自己的 Web 服务。

Web API 核心

到目前为止,您已经学习了如何从头开始在 .NET Core 中创建 Web API 项目以及如何使用 Postman 进行第一次 API 调用。

在接下来的章节中,我们将为我们的 RPG(角色扮演游戏)角色创建一个新的控制器和模型。

此外,我们将把同步调用转变为异步调用,利用数据传输对象 (DTO) 并更改 Web API 的结构,以使其符合最佳实践。

但首先,让我们看一下模型-视图-控制器(MVC)模式,它是所有这一切的基础。

模型-视图-控制器(MVC)模式

模型-视图-控制器(简称 MVC)是一种软件设计模式,它将相关的程序逻辑划分为三个相互关联的元素。让我来解释一下这三个元素各自代表什么,以及它们如何协作。

我们从模型开始,也可以说,数据。例如,我们角色扮演游戏中的角色就是一个模型。它可以有 ID、名称、生命值、属性、技能等等。

public class Character
{
    public int Id { get; set; } = 0;
    public string Name { get; set; } = "Frodo";
    public int HitPoints { get; set; } = 100;
    public int Strength { get; set; } = 10;
    public int Defense { get; set; } = 10;
    public int Intelligence { get; set; } = 10;
}
Enter fullscreen mode Exit fullscreen mode

作为开发者,您知道模型的代码。但用户看不到您的代码。这时视图就派上用场了。用户可能希望看到角色以 HTML、纯文本或精美的 3D 图形形式呈现——具体取决于您的游戏。换句话说,视图就是(图形)用户界面 (GUI)。

总结一下,模型更新视图,用户看到的是视图。如果模型发生变化,比如我们的角色获得了新的技能或者生命值减少了,视图也会随之改变。这就是为什么模型总是更新视图。

MVC 设计模式

那么,控制器是怎么回事呢?控制器负责实际工作。你会在那里找到大部分代码,因为它会操作你的数据或模型。在我们的例子中,它是负责创建、更新和删除数据的 Web API。

MVC 设计模式

由于除了 Postman 中的调用结果外,我们没有视图,因此我们将按照以下顺序构建应用程序:首先是模型,然后是控制器。并且我们将始终在这两者之间来回切换。

然而,借助视图,用户可以操作数据,从而通过按钮、文本字段等操作 RPG 角色的属性。在浏览器游戏中,这本质上可能是 JavaScript 代码——或许借助Angular、 React 或 VueJS 等框架。

这段 JavaScript 代码反过来使用控制器进行操作,并将这些更改持久保存到数据库中。被操作的模型将更新视图,然后用户再次看到视图,循环再次开始。

MVC 设计模式

好了,MVC 模式就到此为止。现在我们要构建第一个模型。

新模型

我们首先需要的是新的模型。我们需要一个 RPG 角色本身的模型,以及一个 RPG 角色类型的模型,例如野蛮人、僧侣、死灵法师等等。

首先,我们创建一个“Models”文件夹。对于角色模型,我们将在这个“Models”文件夹中创建一个新类。如果您安装了“C# Extensions”,则可以右键单击添加一个新的 C# 类;否则,只需创建一个新文件即可。

因此,右键单击“Models”文件夹,然后单击“New C# Class”并将此类命名为Character

角色模型

现在让我们添加一些属性。

    public class Character
    {
        public int Id { get; set; }
        public string Name { get; set; } = "Frodo";
        public int HitPoints { get; set; } = 100;
        public int Strength { get; set; } = 10;
        public int Defense { get; set; } = 10;
        public int Intelligence { get; set; } = 10;
    }

Enter fullscreen mode Exit fullscreen mode

我们还将添加一个RpgClass属性,即角色的类型。但首先,我们必须enum为此创建一个新的。

因此,让我们添加一个名为的新 C# 类RpgClass,然后class用替换enum

您可以随意添加任何您想添加的角色扮演职业。在本例中,我使用了骑士、法师和牧师。我想这些是最基础的角色了。一些近战技能,一些魔法技能,当然还有治疗师。

    public enum RpgClass
    {
        Knight = 1,
        Mage = 2,
        Cleric = 3
    }
Enter fullscreen mode Exit fullscreen mode

现在,当我们RpgClass准备好枚举时,我们最终可以将其添加到Character模型中。

    public class Character
    {
        public int Id { get; set; }
        public string Name { get; set; } = "Frodo";
        public int HitPoints { get; set; } = 100;
        public int Strength { get; set; } = 10;
        public int Defense { get; set; } = 10;
        public int Intelligence { get; set; } = 10;
        public RpgClass Class { get; set; } = RpgClass.Knight;
    }
Enter fullscreen mode Exit fullscreen mode

我将默认设置为骑士,但同样,这完全取决于你。

好了,第一个模型已经准备好了。现在让我们添加一个新的控制器,并调用它GET来接收我们的第一个角色扮演游戏角色。

新的控制器并获得新的角色

要添加新的控制器,我们在 Controllers 文件夹中创建一个新的 C# 类。我们将这个类命名为CharacterController

在开始实现任何逻辑之前,我们必须先将其变为一个合适的控制器。为此,我们首先从 派生ControllerBase。这是一个不带视图支持的 MVC 控制器的基类。由于我们在此构建 API,因此不需要视图支持。但是,如果我们想要添加对视图的支持,我们可以从 派生Controller。但在本例中,只需确保添加 即可ControllerBase

public class CharacterController : ControllerBase
Enter fullscreen mode Exit fullscreen mode

之后,我们需要添加一些属性。第一个是ApiController属性。此属性指示使用哪种类型(以及所有派生类型)来处理 HTTP API 响应。此外,当我们将此属性添加到控制器时,它会启用一些特定于 API 的功能,例如属性路由和在模型出现问题时自动返回 HTTP 400 响应。我们将在使用这些功能时详细介绍。

[ApiController]
public class CharacterController : ControllerBase
Enter fullscreen mode Exit fullscreen mode

关于属性路由,这是我们接下来要添加的内容。在ApiController属性下方,我们添加Route属性。这样,当我们想要进行 Web 服务调用时,就能找到这个特定的控制器。我们添加到Route属性的字符串是[controller]。这意味着可以通过其名称访问该控制器,在我们的例子中Character,也就是 C# 类名称中位于 之前的部分Controller

[ApiController]
[Route("[controller]")]
public class CharacterController : ControllerBase
Enter fullscreen mode Exit fullscreen mode

Microsoft.AspNetCore.Mvc不要忘记在文件顶部添加参考。

using Microsoft.AspNetCore.Mvc;
Enter fullscreen mode Exit fullscreen mode

好了,让我们开始编写 C# 类的主体。首先我想添加一个静态模拟字符,以便返回给客户端。为此,您还需要添加dotnet_rpg.Models引用。

using Microsoft.AspNetCore.Mvc;
using dotnet_rpg.Models;

namespace dotnet_rpg.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class CharacterController : ControllerBase
    {
        private static Character knight = new Character();
    }
}
Enter fullscreen mode Exit fullscreen mode

接下来我们最终实现Get()接收我们的游戏角色的方法。

    [ApiController]
    [Route("[controller]")]
    public class CharacterController : ControllerBase
    {
        private static Character knight = new Character();

        public IActionResult Get()
        {
            return Ok(knight);
        }
    }
Enter fullscreen mode Exit fullscreen mode

我们返回一个,IActionResult因为这使我们能够将特定的 HTTP 状态代码与实际请求的数据一起发送回客户端。在此方法中,Ok(knight)我们将状态代码200 OK和模拟字符一起发送回去。其他选项包括状态代码,或者如果未找到请求的字符,则返回BadRequest 400一个。404 NotFound

好了,代码已经实现。现在让我们用 Postman 来测试一下。

现在非常简单了。HTTP 方法GET和 URL 都设置好了,http://localhost:5000/character其他什么都不用配置。

点击“发送”,我们的骑士就出现了!

第一次 Get() 调用的结果

现在请注意添加到我们Get()方法中的属性。没错,没有当我们将它与 进行比较时WeatherForecastController,我们可以添加一个[HttpGet]属性。但这并非必需,CharacterController因为 Web API 支持命名约定,如果方法名称以 开头Get...(),API 会假定所使用的 HTTP 方法也是GET。除此之外,Get()到目前为止,我们的控制器中只有一个方法,因此 Web 服务确切地知道请求了哪个方法。

然而,在下一章中,我们将更深入地了解这些属性。


这就是本系列教程的第一部分。希望它对你有所帮助。想要收到下一部分的通知,只需在dev.to上关注我或订阅我的新闻通讯即可。你将第一时间知道。

下次再见!

小心。


接下来:属性路由、HTTP 方法、使用 POST 添加新角色、异步调用等等!

图片由 cornecoba 在freepik.com上创建。


但请稍等,还有更多!

文章来源:https://dev.to/_patrickgod/net-core-3-1-web-api-entity-framework-jumpstart-part-1-4jla
PREV
多睡觉,多写代码
NEXT
程序员的 3 个健康习惯