百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)

wptr33 2025-01-07 16:17 93 浏览

本章介绍如何使用 ASP.NET Core 在服务器端构建具有现代 HTTP 架构的网站。

ASP.NET Core 是一个由微软开发的免费、开源和跨平台的 web 框架,用于构建现代、基于云和互联网连接的应用程序。它是对之前的 ASP.NET 框架的重大重新设计,专注于灵活性、模块化和性能。

ASP.NET Core 提供了一个统一的编程模型,用于构建 Web 用户界面 (UI) 和 Web API,这意味着您可以使用相同的框架来处理服务器端和客户端逻辑。

ASP.NET Core 针对高性能进行了优化,能够处理大量的每秒请求。它具有轻量级的模块化架构,允许开发人员仅包含必要的组件,从而减少整体占用。

您将学习如何使用 ASP.NET Core 8 中引入的 Blazor 静态服务器端渲染 (SSR) 功能构建简单的网站。

本章涵盖以下主题:

  • 探索 ASP.NET Core
  • Blazor 的历史
  • 探索 Blazor 静态 SSR
  • 使用 Entity Framework Core 和 ASP.NET Core

探索 ASP.NET Core

在我们探索一个示例 ASP.NET Core 项目之前,让我们回顾一下它的架构。

ASP.NET Core 的架构

ASP.NET Core 的架构由几个关键组件组成:

  • 中间件:中间件组件用于处理请求和响应。它们在管道中串联在一起,每个中间件处理请求并将其传递给链中的下一个组件。在本章的可选在线部分中,您可以学习如何自定义此管道。
  • 路由:路由组件负责将传入请求映射到适当的端点和 Blazor 组件。
  • 依赖注入(DI)容器:这是内置的,用于管理服务对象的生命周期和依赖关系。
  • 配置:ASP.NET Core 使用灵活的配置系统,支持多种来源,如 JSON 文件、环境变量和命令行参数。
  • 日志记录:该框架具有一个日志记录 API,支持多种日志提供程序,允许您以一致的方式捕获和存储日志数据。

现在我们将创建一个空的 ASP.NET Core 项目,并探索如何使其能够提供简单的网页。

创建一个空的 ASP.NET Core 项目

我们将创建一个 ASP.NET Core 项目,该项目将显示来自 Northwind 数据库的供应商列表。

dotnet 工具有许多项目模板,可以为您完成很多工作,但很难知道哪种模板最适合特定情况,因此我们将从空网站项目模板开始,然后逐步添加功能,以便您可以理解所有部分:

  1. 使用您首选的代码编辑器打开 ModernWeb 解决方案,然后添加一个新项目,如下列表所定义:
  2. 项目模板:ASP.NET Core 空项目 [C#] / web 。对于 Rider,选择名为 ASP.NET Core Web 应用程序的项目模板,然后将类型设置为空。
  3. 项目文件和文件夹: Northwind.Web
  4. 解决方案文件和文件夹: ModernWeb
  5. 对于 Visual Studio,保持所有其他选项为默认设置。
  6. 例如:
  7. 框架:.NET 9.0(标准术语支持)
  8. 配置为 HTTPS:已选择
  9. 启用 Docker:已清除
  10. 请勿使用顶级语句:已清除
  11. 对于 VS Code 和 dotnet new web 命令,默认选项是我们想要的。在未来的项目中,如果您想从顶级语句更改为旧的 Program 类样式,请指定开关 --use-program-main

在创建新项目时,Visual Studio 和 dotnet new 选项的摘要可以在以下链接的 GitHub 仓库中找到:https://github.com/markjprice/cs13net9/blob/main/docs/ch01-project-options.md。

  1. 构建 Northwind.Web 项目。
  2. Northwind.Web.csproj 中,请注意该项目类似于类库,只是 SDK 是 Microsoft.NET.Sdk.Web ,如下标记中所示:
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
</Project>

添加一个元素以全局和静态方式导入 System.Console 类,如下所示的标记:

<ItemGroup Label="To simplify use of WriteLine.">
  <Using Include="System.Console" Static="true" />
</ItemGroup>
  1. 如果您使用的是 Visual Studio,请在解决方案资源管理器中切换显示所有文件。如果您使用的是 Rider,请将光标移动到解决方案窗格上,然后点击“眼球”图标。
  2. 展开 obj 文件夹,展开 Debug 文件夹,展开 net9.0 文件夹,并选择 Northwind.Web.GlobalUsings.g.cs 文件。请注意,隐式导入的命名空间包括控制台应用程序或类库的所有命名空间,以及一些 ASP.NET Core 的命名空间,例如 Microsoft.AspNetCore.Builder ,如下代码所示:
// <autogenerated />
global using global::Microsoft.AspNetCore.Builder;
global using global::Microsoft.AspNetCore.Hosting;
global using global::Microsoft.AspNetCore.Http;
global using global::Microsoft.AspNetCore.Routing;
global using global::Microsoft.Extensions.Configuration;
global using global::Microsoft.Extensions.DependencyInjection;
global using global::Microsoft.Extensions.Hosting;
global using global::Microsoft.Extensions.Logging;
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Net.Http.Json;
global using global::System.Threading;
global using global::System.Threading.Tasks;
global using static global::System.Console;
  1. 关闭文件并折叠 obj 文件夹。
  2. Northwind.Web 项目/文件夹中,展开名为 Properties 的文件夹,打开名为 launchSettings.json 的文件,并注意名为 httphttps 的配置文件。它们有随机分配的端口号,您将在下一步中更改,因此现在只需记下它们的位置,如以下配置中所示的高亮部分:
{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:14842",
      "sslPort": 44352
    }
  },
  "profiles": {
    "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "http://localhost:5122",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "https": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7155;http://localhost:5122",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

launchSettings.json 文件仅在开发期间使用。它对构建过程没有影响。它不会与编译后的网站项目一起部署,因此对生产运行时没有影响。它仅被像 Visual Studio 和 Rider 这样的代码编辑器处理,以设置环境变量并定义项目在代码编辑器启动时供 Web 服务器监听的 URL。

  1. 对于 https 配置文件,对于其 applicationUrl ,将 http 的分配端口号更改为 5130 ,将 https 更改为 5131 ,并交换顺序,使 http 在列表中排在第一位,并将作为默认使用,如以下标记中所示:
"applicationUrl": "http://localhost:5130;https://localhost:5131",

httphttps 启动配置文件具有 commandNameProject ,这意味着它们使用项目中配置的网络服务器来托管网站,默认情况下是 Kestrel。还有一个用于 IIS 的配置文件和设置,IIS 是仅限 Windows 的网络服务器。在本书中,我们将仅使用 Kestrel 作为网络服务器,因为它是跨平台的。为了简化您的 launchSettings.json 文件,您甚至可以删除 iisSettingsIIS Express 部分。

  1. 将更改保存到 launchSettings.json 并关闭文件。
  2. Program.cs 中,请注意以下事项:一个 ASP.NET Core 项目就像一个顶级控制台应用程序,具有一个隐藏的 <Main>$ 方法作为其入口点,该方法使用名称 args 传递一个参数。它调用 WebApplication.CreateBuilder ,该函数使用默认的网络主机创建网站的主机,然后进行构建。该网站将对所有 HTTP GET 请求以该网站的根路径响应以下纯文本: Hello World! 。对 Run 方法的调用是一个阻塞调用,因此隐藏的 <Main>$ 方法在 web 服务器停止运行之前不会返回。

Program.cs 的内容在以下代码中显示:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();

在现有对 MapGet 的调用后,添加两个调用以定义一个返回匿名 C# 对象作为 JSON 的端点,以及一个返回网页的端点,如以下代码所示:

app.MapGet("/data", () => Results.Json(new
{
  firstName = "John",
  lastName = "Doe",
  age = 30
}));
app.MapGet("/welcome", () => Results.Content(
  content: #34;""
  <!doctype html>
  <html lang="en">
  <head>
    <title>Welcome to Northwind Web!</title>
  </head>
  <body>
    <h1>Welcome to Northwind Web!</h1>
  </body>
  </html>
  """,
  contentType: "text/html"));

除了 JsonContentResults 类还有许多其他方法,如 BadRequestBytesCreatedFileNoContentNotFoundOkProblemRedirect 等。您可以在以下链接了解更多信息:https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.results。

  1. Program.cs 的底部,添加一个注释以解释 Run 方法,并在 Run 之后写一条消息到控制台,因此,在网络服务器停止后,如以下代码中突出显示的内容所示:
// Start the web server, host the website, and wait for requests.
app.Run(); // This is a thread-blocking call.
WriteLine("This executes after the web server has stopped!");

测试和保护网站

我们现在将测试 ASP.NET Core 空网站项目的功能。我们还将通过将 HTTP 切换到 HTTPS 来启用浏览器与 Web 服务器之间所有流量的加密,以保护隐私。HTTPS 是 HTTP 的安全加密版本。

  • 对于 Visual Studio:在工具栏中,确保选择了 https 配置文件(而不是 http、IIS Express 或 WSL),然后将 Web 浏览器更改为 Google Chrome,如图 13.1 所示:
  1. 导航到 调试 | 无调试启动….
  2. 在 Windows 中,如果您看到 Windows 安全警报,提示 Windows Defender 防火墙已阻止此应用程序的一些功能,请点击允许访问按钮。
  3. 第一次启动安全网站时,您可能会收到通知,您的项目已配置为使用 SSL,为了避免浏览器中的警告,您可以选择信任 ASP.NET Core 生成的自签名证书。点击“是”。当您看到安全警告对话框时,再次点击“是”。
  • 对于 VS Code,输入命令以 https 配置文件启动项目,如下所示: dotnet run --launch-profile https 。然后启动 Chrome。
  • 对于骑手:导航到 运行 | 编辑配置….在运行/调试配置对话框中,选择 Northwind.Web: https。在对话框底部,位于“启动后”复选框的右侧,选择 Chrome,然后点击确定。导航到 运行 | 运行 ‘Northwind.Web: https’
  1. 在 Visual Studio 的命令提示符窗口或 VS Code 的终端中,请注意以下内容,如下输出所示:网络服务器已开始监听我们为 HTTP 和 HTTPS 分配的端口。您可以按 Ctrl + C 关闭 Kestrel Web 服务器。托管环境是 Development
info: Microsoft.Hosting.Lifetime[14]
  Now listening on: http://localhost:5130
info: Microsoft.Hosting.Lifetime[14]
  Now listening on: https://localhost:5131
info: Microsoft.Hosting.Lifetime[0]
  Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
  Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
  Content root path: C:\cs13net9\ModernWeb\Northwind.Web

Visual Studio 还会自动启动您选择的浏览器并导航到第一个 URL。如果您使用的是 VS Code,您需要手动启动 Chrome。

  1. 在命令提示符或终端中保持 Kestrel web 服务器运行。
  2. 在 Chrome 中,显示开发者工具,然后点击网络标签。
  3. 请求网站项目的主页:如果您使用的是 Visual Studio,并且 Chrome 自动启动并已为您输入了 URL,请单击“重新加载此页面”按钮或按 F5。如果您正在使用 VS Code 和命令提示符或终端,则在 Chrome 地址栏中手动输入地址 http://localhost:5130/
  4. 在网络选项卡中,点击 localhost,并注意响应是来自跨平台 Kestrel web 服务器的纯文本 Hello World!,如图 13.2 所示:

像 Chrome 这样的浏览器可能还会请求一个 favicon.ico 文件以在其浏览器窗口或标签中显示,但该文件在我们的项目中不存在,因此显示为 404 Not Found 错误。如果这让你感到烦恼,你可以在以下链接免费生成一个 favicon.ico 文件并将其放入项目文件夹中:https://favicon.io/。在网页中,你还可以在元标签中指定一个,例如,使用 Base64 编码的空白文件,如以下标记所示:

<link rel="icon" href="data:;base64,iVBORw0KGgo=">

  1. 输入地址 https://localhost:5131/ ,请注意,如果您没有使用 Visual Studio 或在被提示信任 SSL 证书时点击了“否”,那么响应将是隐私错误。当您没有配置浏览器可以信任的证书以加密和解密 HTTPS 流量时,您将看到此错误(如果您没有看到此错误,那是因为您已经配置了证书)。在生产环境中,您可能希望向像 Verisign 这样的公司支付 SSL 证书费用,因为他们提供责任保护和技术支持。在开发过程中,您可以告诉您的操作系统信任 ASP.NET Core 提供的临时开发证书。

Visual Studio 还会自动启动您选择的浏览器并导航到第一个 URL。如果您使用的是 VS Code,您需要手动启动 Chrome。

  1. 输入地址 https://localhost:5131/data 并注意返回了一些 JSON。
  2. 输入地址 https://localhost:5131/welcome 并注意返回了一个网页。
  3. 在命令提示符或终端中,按 Ctrl + C 关闭网络服务器,并注意写入的消息,如以下输出中突出显示的内容:
info: Microsoft.Hosting.Lifetime[0]
      Application is shutting down...
This executes after the web server has stopped!

C:\cs13net9\ModernWeb\Northwind.Web\bin\Debug\net9.0\Northwind.Web.exe (process 19888) exited with code 0.
  1. 如果您需要信任本地自签名的 SSL 证书,请在命令行或终端中输入以下命令: dotnet dev-certs https --trust
  2. 注意消息请求信任 HTTPS 开发证书。您可能会被提示输入密码,并且可能已经存在有效的 HTTPS 证书。

启用更强的安全性并重定向到安全连接

启用更严格的安全性并自动将 HTTP 请求重定向到 HTTPS 是一种良好的做法。

良好实践:一个可选但推荐的安全增强是 HTTP 严格传输安全(HSTS),您应该始终启用它。如果一个网站指定了它并且浏览器支持它,那么它会强制所有通信通过 HTTPS 进行,并防止访问者使用不受信任或无效的证书。

现在就来做吧:

  1. Program.cs 中,在构建 app 的语句之后,添加一个区域和一个 if 语句,以在非开发环境中启用 HSTS,并将 HTTP 请求重定向到 HTTPS,如以下代码中突出显示的内容所示:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
#region Configure the HTTP pipeline and routes
if (!app.Environment.IsDevelopment())
{
  app.UseHsts();
}
app.UseHttpsRedirection();
app.MapGet("/", () => "Hello World!");
// Other MapGet calls.
#endregion
// Start the web server, host the website, and wait for requests.
app.Run(); // This is a thread-blocking call.
WriteLine("This executes after the web server has stopped!");
  1. 使用 https 启动配置启动 Northwind.Web 网站项目而不进行调试。
  2. 如果 Chrome 仍在运行,请关闭并重新启动它。
  3. 在 Chrome 中,显示开发者工具,然后点击网络标签。
  4. 输入地址 http://localhost:5130/ ,并注意服务器如何以 307 临时重定向响应到 https://localhost:5131/ ,以及证书是有效且受信任的,如图 13.3 所示:
  1. 关闭 Chrome 并关闭网络服务器。

良好实践:记得在完成网站测试后,通过切换到命令提示符或终端并按 Ctrl + C 来关闭 Kestrel 网络服务器。

控制托管环境

在 ASP.NET Core 5 及更早版本中,项目模板设置了一条规则,表示在开发模式下,任何未处理的异常将在浏览器窗口中显示,以便开发人员查看异常的详细信息,如以下代码所示:

if (app.Environment.IsDevelopment())
{
  app.UseDeveloperExceptionPage();
}

使用 ASP.NET Core 6 及更高版本,此代码由 WebApplication 构建器默认配置,因此会自动执行,因此在项目模板 Program.cs 源代码中不再需要。

ASP.NET Core 如何知道我们何时在开发模式下运行,以便 IsDevelopment 方法返回 true ,并且这段额外代码执行以设置开发者异常页面?让我们来看看。

ASP.NET Core 可以从设置文件和环境变量中读取,以确定使用哪个托管环境,例如 DOTNET_ENVIRONMENTASPNETCORE_ENVIRONMENT

您可以在本地开发期间覆盖这些设置:

  1. Northwind.Web 文件夹中,展开名为 Properties 的文件夹,并打开名为 launchSettings.json 的文件。请注意, https 启动配置将托管环境的环境变量设置为 Development ,如下所示在以下配置中突出显示:
"https": {
  "commandName": "Project",
  "dotnetRunMessages": true,
  "launchBrowser": true,
  "applicationUrl": "https://localhost:5131;http://localhost:5130",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
},
  1. ASPNETCORE_ENVIRONMENT 环境变量从 Development 更改为 Production
  2. 如果您正在使用 Visual Studio,可以选择将 launchBrowser 更改为 false 以防止 Visual Studio 自动启动浏览器。当您使用 dotnet run 或 Rider 启动网站项目时,此设置将被忽略。
  3. Program.cs 中,将第一个 MapGet 语句修改为返回环境的名称,而不是 Hello World ,如下代码中所示的高亮部分:
app.MapGet("/", () =>
  #34;Environment is {app.Environment.EnvironmentName}");

使用 https 启动配置启动网站项目,并注意托管环境为 Production ,如下所示的输出:

info: Microsoft.Hosting.Lifetime[0]
  Hosting environment: Production
  1. 在 Chrome 中,请注意纯文本是 Environment is Production
  2. 关闭网络服务器。
  3. launchSettings.json 中,将环境变量更改回 Development ,并将更改保存到文件中。

更多信息:您可以通过以下链接了解有关环境的更多信息:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/environments。

相关推荐

【推荐】一款开源免费、美观实用的后台管理系统模版

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍...

Android架构组件-App架构指南,你还不收藏嘛

本指南适用于那些已经拥有开发Android应用基础知识的开发人员,现在想了解能够开发出更加健壮、优质的应用程序架构。首先需要说明的是:AndroidArchitectureComponents翻...

高德地图经纬度坐标批量拾取(高德地图批量查询经纬度)

使用方法在桌面上新建一个index.txt文件,把下面的代码复制进去保存,再把文件名改成index.html保存,双击运行打开即可...

flutter系列之:UI layout简介(flutter ui设计)

简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。...

Android开发基础入门(一):UI与基础控件

Android基础入门前言:...

iOS的布局体系-流式布局MyFlowLayout

iOS布局体系的概览在我的CSDN博客中的几篇文章分别介绍MyLayout布局体系中的视图从一个方向依次排列的线性布局(MyLinearLayout)、视图层叠且停靠于父布局视图某个位置的框架布局(M...

TDesign企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序

TDesing发展越来越好了,出了好几套组件库,很成熟稳定了,新项目完全可以考虑使用。...

WinForm实现窗体自适应缩放(winform窗口缩放)

众所周知,...

winform项目——仿QQ即时通讯程序03:搭建登录界面

上两篇文章已经对CIM仿QQ即时通讯项目进行了需求分析和数据库设计。winform项目——仿QQ即时通讯程序01:原理及项目分析...

App自动化测试|原生app元素定位方法

元素定位方法介绍及应用Appium方法定位原生app元素...

61.C# TableLayoutPanel控件(c# tabcontrol)

摘要TableLayoutPanel在网格中排列内容,提供类似于HTML元素的功能。TableLayoutPanel控件允许你将控件放在网格布局中,而无需精确指定每个控件的位置。其单元格...

想要深入学习Android性能优化?看完这篇直接让你一步到位

...

12个python数据处理常用内置函数(python 的内置函数)

在python数据分析中,经常需要对字符串进行各种处理,例如拼接字符串、检索字符串等。下面我将对python中常用的内置字符串操作函数进行介绍。1.计算字符串的长度-len()函数str1='我爱py...

如何用Python程序将几十个PDF文件合并成一个PDF?其实只要这四步

假定你有一个很无聊的任务,需要将几十个PDF文件合并成一个PDF文件。每一个文件都有一个封面作为第一页,但你不希望合并后的文件中重复出现这些封面。即使有许多免费的程序可以合并PDF,很多也只是简单的将...

Python入门知识点总结,Python三大数据类型、数据结构、控制流

Python基础的重要性不言而喻,是每一个入门Python学习者所必备的知识点,作为Python入门,这部分知识点显得很庞杂,内容分支很多,大部分同学在刚刚学习时一头雾水。...