记录和尝试网络服务
您可以通过使用浏览器发出 HTTP GET 请求轻松尝试一个网络服务。要尝试其他 HTTP 方法,我们需要一个更高级的工具。
使用浏览器尝试 GET 请求
您将使用 Chrome 尝试三种 GET 请求的实现——针对所有客户、针对指定国家的客户,以及针对使用其唯一客户 ID 的单个客户:
- 使用 https 启动配置启动 Northwind.WebApi 网络服务项目。
- 启动 Chrome,导航到 https://localhost:5151/customers ,并注意返回的 JSON 文档,其中包含北风数据库中的所有 91 个客户(未排序),如图 15.2 所示:
- 导航到 https://localhost:5151/customers/in/Germany 并注意返回的 JSON 文档,仅包含德国的客户。
如果返回的是一个空数组 [] ,请确保您使用正确的大小写输入了国家名称,因为数据库查询是区分大小写的。例如,比较 uk 和 UK 的结果。
- 导航到 https://localhost:5151/customers/alfki ,并注意返回的 JSON 文档,其中仅包含名为 Alfreds Futterkiste 的客户。
与国家名称不同,我们不需要担心客户 id 值的大小写,因为在客户存储库实现中,我们将 string 值规范化为大写。
但是我们如何尝试其他 HTTP 方法,例如 POST 、 PUT 和 DELETE 呢?我们又如何记录我们的网络服务,以便任何人都能轻松理解如何与之交互?
有许多用于测试 Web 服务的工具,例如 Postman。尽管 Postman 很受欢迎,但我更喜欢 Visual Studio 中的 HTTP Editor 或 VS Code 中的 REST Client,因为它们不会隐藏发生的事情。我觉得 Postman 过于图形化。但我鼓励你探索不同的工具,找到适合你风格的工具。你可以在以下链接了解更多关于 Postman 的信息:https://www.postman.com/。
要解决第一个问题,我们可以使用内置于 Visual Studio 的 HTTP 编辑器工具,并安装一个名为 REST Client 的 VS Code 扩展。Rider 有其自己的等效工具。这些工具允许您发送任何类型的 HTTP 请求,并在代码编辑器中查看响应。
为了解决第二个问题,我们可以使用 OpenAPI,也称为 Swagger,这是世界上最流行的 HTTP API 文档技术。但首先,让我们看看代码编辑器 HTTP/REST 工具可以实现什么。
使用 HTTP/REST 工具发起 GET 请求
我们将首先创建一个文件来发起 GET 请求:
- 如果您还没有安装 Huachao Mao 的 REST Client ( humao.rest-client ),请立即为 VS Code 安装它。
- 在您首选的代码编辑器中,打开 ModernWeb 解决方案,然后启动 Northwind.WebApi 项目的 Web 服务。
- 在文件资源管理器、Finder 或您喜欢的 Linux 文件工具中,在 ModernWeb 文件夹中创建一个 HttpRequests 文件夹。
- 在 HttpRequests 文件夹中,创建一个名为 get-customers.http 的文件,并在您喜欢的代码编辑器中打开它。
- 在 get-customers.http 中,修改其内容以包含一个 HTTP GET 请求以检索所有客户,如以下代码所示:
### Configure a variable for the web service base address.
@base_address = https://localhost:5151/customers/
### Make a GET request to the base address.
GET {{base_address}}
- 在 HTTP GET 请求上方,点击发送请求,如图 15.3 所示。
请注意,响应将在一个新的标签窗口中显示。
- 如果您正在使用 Visual Studio,请点击 Raw 选项卡,并注意返回的 JSON,如图 15.3 所示:
Visual Studio 17.8 及更高版本中的 HTTP 编辑器是一个旨在添加类似 REST 客户端功能的特性,其用户界面可能会随着其发展而迅速演变。您可以在以下链接阅读其官方文档:https://learn.microsoft.com/en-us/aspnet/core/test/http-files。
- 在 get-customers.http 中,添加更多 GET 请求,每个请求之间用三个井号分隔,以测试获取不同国家的客户和使用其 ID 获取单个客户,如以下代码所示:
### Get customers in Germany
GET {{base_address}}in/Germany
### Get customers in USA
GET {{base_address}}in/USA
### Get Alfreds Futterkiste
GET {{base_address}}ALFKI
### Get a non-existent customer
GET {{base_address}}abcxy
- 点击每个请求上方的发送请求链接以发送请求,并确认您收到预期的响应,例如对于不存在的客户返回 404。
使用 HTTP/REST 工具进行其他请求
接下来,我们将创建一个文件以进行其他请求,例如 POST :
- 在 HttpRequests 文件夹中,创建一个名为 create-customer.http 的文件,并修改其内容以定义一个 POST 请求以创建新客户,如以下代码所示:
### Configure a variable for the web service base address.
@base_address = https://localhost:5151/customers/
### Make a POST request to the base address.
POST {{base_address}}
Content-Type: application/json
{
"customerID": "ABCXY",
"companyName": "ABC Corp",
"contactName": "John Smith",
"contactTitle": "Sir",
"address": "Main Street",
"city": "New York",
"region": "NY",
"postalCode": "90210",
"country": "USA",
"phone": "(123) 555-1234"
}
- 发送请求并注意响应为 201 Created 。还要在 Headers 部分注意新创建客户的 Location(即 URL)为 /customers/ABCXY ,如图 15.4 所示,响应中包含新创建客户的信息在响应体中(未在截图中显示,但您可以在格式化和原始部分看到):
我将给你留一个可选的挑战,创建 .http 个文件,尝试更新一个客户(使用 PUT )和删除一个客户(使用 DELETE )。在存在的客户和不存在的客户上都试试。解决方案在本书的 GitHub 仓库中,链接如下:
https://github.com/markjprice/cs13net9/tree/main/code/ModernWeb/HttpRequests
传递环境变量
要在 .http 脚本中获取环境变量,请使用 $processenv ,如以下命令所示:
{{$processEnv [%]envVarName}}
例如,如果您设置了一个环境变量来存储一个秘密值,比如连接到必须保密的 SQL Server 数据库的密码,而这个值不能出现在提交到 GitHub 仓库的任何文件中,您可以使用以下命令:
{{$processEnv MY_SQL_PWD}}
更多信息:您可以通过以下链接了解有关在 REST 客户端中使用环境变量的更多信息:https://marketplace.visualstudio.com/items?itemName=humao.rest-client#environments。您可以通过以下链接了解有关在 HTTP 编辑器中使用环境变量和秘密管理器的更多信息:https://devblogs.microsoft.com/visualstudio/safely-use-secrets-in-http-requests-in-visual-studio-2022/。
现在我们已经看到了一个快速简便的方式来测试我们的服务,这也是学习 HTTP 的好方法,那么外部开发者呢?我们希望他们能够尽可能轻松地了解并调用我们的服务。为此,我们将使用 Swagger。
理解 OpenAPI 规范
OpenAPI 规范定义了您的 API 的 REST 风格合同,以人类和机器可读的格式详细描述其所有资源和操作,以便于开发、发现和集成。
开发人员可以使用 OpenAPI 规范为 Web 服务自动生成其首选语言或库中的强类型客户端代码。
让我们回顾一下如何为我们的网络服务启用 OpenAPI:
- 如果网络服务正在运行,请关闭网络服务器。
- 在 Northwind.WebApi.csproj 中,请注意项目模板添加的实现 OpenAPI 文档的 Microsoft 包的包引用,如下标记所示:
在 Program.cs 中,在为容器添加服务的部分,请注意项目模板注册的使用 OpenAPI 的服务,如以下代码所示:
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();
默认情况下,文档名称为 v1 。将文档名称参数设置为 v2 ,如下代码所示:
builder.Services.AddOpenApi(documentName: "v2");
在配置 HTTP 请求管道的部分,请注意在开发模式下使用 OpenAPI 的语句,如以下代码中突出显示的内容:
// Configure the HTTP request pipeline.
if (builder.Environment.IsDevelopment())
{
app.MapOpenApi();
}
- 使用 https 启动配置启动 Northwind.WebApi 网络服务项目。
- 启动 Chrome,导航到 https://localhost:5151/openapi/v2.json ,并注意返回的 JSON 文档,如图 15.5 所示:
请注意以下关于 OpenAPI JSON 文档的内容:
- 它指定了服务的所有相对路径,例如 /weatherforecast/{days} 。
- 对于像 days 这样的参数,它指定了它们的类型和默认值,例如 "parameters":[{"name":"days","in":"path","required":true,"schema":{"type":"integer","format":"int32","default":5}}] 。
您可以使用两种技术向生成的文档添加额外信息, WithSummary 和 WithDescription 。这些可以通过在映射端点后调用扩展方法或通过用属性装饰 lambda 表达式来实现,如以下代码所示:
app.MapGet("/helloUsingMethods", () => "Hello world!")
.WithSummary("This is a summary.")
.WithDescription("This is a description.");
app.MapGet("/helloUsingAttributes",
[EndpointSummary("This is a summary.")]
[EndpointDescription("This is a description.")]
() => "Hello world!");
更多信息:您可以通过以下链接了解更多:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis/openapi?view=aspnetcore-9.0#describe-endpoints。
启用 HTTP 日志记录
HTTP 日志记录是一个可选的中间件组件,在测试 Web 服务时非常有用。它记录有关 HTTP 请求和 HTTP 响应的信息,包括以下内容:
- 关于 HTTP 请求的信息
- 标题
- 身体
- 关于 HTTP 响应的信息
这在网络服务的审计和调试场景中是有价值的,但要注意,因为它可能会对性能产生负面影响。您还可能会记录个人可识别信息(PII),这在某些司法管辖区可能会导致合规问题。
日志级别可以设置为以下内容:
- Error : 仅 Error 级日志
- Warning : Error 和 Warning 级日志
- Information : Error , Warning , 和 Information 级日志
- Verbose : 所有级别日志
日志级别可以为定义功能的命名空间设置。嵌套命名空间允许我们控制哪些功能启用了日志记录:
- Microsoft : 包含所有日志类型在 Microsoft 命名空间中
- Microsoft.AspNetCore : 包含所有日志类型在 Microsoft.AspNetCore 命名空间中
- Microsoft.AspNetCore.HttpLogging : 包含所有日志类型在 Microsoft.AspNetCore.HttpLogging 命名空间中
让我们看看 HTTP 日志记录的实际应用:
- 在 Northwind.WebApi 项目中, appsettings.Development.json ,添加一个条目以将 HTTP 日志中间件设置为 Information 级别,如以下代码中突出显示的所示:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"
}
}
}
- 尽管 Default 日志级别可能设置为 Information ,但更具体的配置优先。例如, Microsoft.AspNetCore 命名空间中的任何日志系统将使用 Warning 级别。通过我们所做的更改, Microsoft.AspNetCore. HttpLogging.HttpLoggingMiddleware 命名空间中的任何日志系统现在将使用 Information 。
- 在 Program.cs 中,导入用于处理 HTTP 日志的命名空间,如下代码所示:
using Microsoft.AspNetCore.HttpLogging; // To use HttpLoggingFields.
在服务配置部分,在调用 Build 之前,添加一条语句以配置 HTTP 日志记录,如以下代码所示:
builder.Services.AddHttpLogging(options =>
{
options.LoggingFields = HttpLoggingFields.All;
options.RequestBodyLogLimit = 4096; // Default is 32k.
options.ResponseBodyLogLimit = 4096; // Default is 32k.
});
在 HTTP 管道配置部分,在调用 app.UseHttpsRedirection 之前,添加一条语句以添加 HTTP 日志记录,如以下代码所示:
app.UseHttpLogging();
- 使用 https 启动配置启动 Northwind.WebApi 网络服务。
- 启动 Chrome 并导航到 https://localhost:5151/customers 。
- 在显示来自网络服务主机输出的命令提示符或终端中,请注意请求和响应已被记录,如以下部分输出所示:
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
Request:
Protocol: HTTP/2
Method: GET
Scheme: https
PathBase:
Path: /weatherforecast
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Host: localhost:5151
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en-GB;q=0.9,en;q=0.8,fr-FR;q=0.7,fr;q=0.6
Upgrade-Insecure-Requests: [Redacted]
...
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
Response:
StatusCode: 200
Content-Type: application/json; charset=utf-8
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[4]
ResponseBody: [{"date":"2024-08-06","temperatureC":50,"summary":"Freezing","temperatureF":121},{"date":"2024-08-07","temperatureC":53,"summary":"Scorching","temperatureF":127},{"date":"2024-08-08","temperatureC":40,"summary":"Mild","temperatureF":103},{"date":"2024-08-09","temperatureC":8,"summary":"Bracing","temperatureF":46},{"date":"2024-08-10","temperatureC":-10,"summary":"Freezing","temperatureF":15}]
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[8]
Duration: 6.8678ms
- 关闭 Chrome 并关闭网络服务器。
记录到仅限 Windows 的事件日志
在配置日志记录时,您可能希望启用对 Windows 事件日志的记录,如以下代码所示:
var builder = Host.CreateApplicationBuilder();
// Option 1
builder.Services.AddLogging(logging =>
{
logging.AddEventLog();
});
// Option 2
builder.Host.ConfigureLogging(logging =>
{
logging.AddEventLog();
});
// Option 3: .NET 6 or later. Concise and recommended by Microsoft.
builder.Logging.AddEventLog();
您将看到一个代码分析器警告, CA1416 ,因为启用事件日志仅在 Windows 上有效。如果您在其他操作系统上运行此代码,则会抛出运行时异常。为了避免警告(和运行时错误),您应该用操作系统检查包装对 AddEventLog 的调用。
首先,导入一个命名空间,如下代码所示:
using System.Runtime.InteropServices; // To use RuntimeInformation.
然后,像下面的代码中所示,包装对 AddEventLog 的任何调用:
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
// Call the AddEventLog method.
}
支持在 W3CLogger 中记录额外的请求头部
W3CLogger 是一个以 W3C 标准格式写入日志的中间件。您可以:
- 记录 HTTP 请求和响应的详细信息。
- 过滤哪些请求和响应消息的头部和部分被记录。
警告!W3CLogger 可能会降低应用程序的性能。
W3CLogger 类似于 HTTP 日志记录,因此我在本书中不会详细介绍如何使用它。您可以通过以下链接了解更多关于 W3CLogger 的信息:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/w3c-logger/.
在 ASP.NET Core 7 或更高版本中,您可以指定在使用 W3CLogger 时要记录额外的请求头。调用 AdditionalRequestHeaders 方法并传递您想要记录的头的名称,如以下代码所示:
services.AddW3CLogging(options =>
{
options.AdditionalRequestHeaders.Add("x-forwarded-for");
options.AdditionalRequestHeaders.Add("x-client-ssl-protocol");
});
您现在准备好构建使用您的网络服务的应用程序。
使用 HTTP 客户端消费 Web 服务
现在我们已经构建并测试了我们的 Northwind 服务,我们将学习如何使用 HttpClient 类及其工厂从任何 .NET 应用程序调用它。
理解 HttpClient
使用 HttpClient 类是消费 Web 服务的最简单方法。然而,许多人错误地使用它,因为它实现了 IDisposable ,而微软自己的文档对此的使用说明也很差。有关更多讨论的文章,请参见 GitHub 存储库中的书籍链接。
通常,当一个类型实现 IDisposable 时,您应该在 using 语句中创建它,以确保尽快释放它。 HttpClient 是不同的,因为它是共享的、可重入的,并且部分线程安全。
问题与如何管理底层网络套接字有关。关键是,在应用程序的生命周期内,您应该为每个您使用的 HTTP 端点使用一个单一实例。这将允许每个 HttpClient 实例设置适合其所处理的端点的默认值,同时有效地管理底层网络套接字。
配置 HTTP 客户端
微软意识到 .NET 开发者误用 HttpClient 的问题,并在 ASP.NET Core 2.1 中引入了 HttpClientFactory 以鼓励最佳实践;这就是我们将使用的技术。
在以下示例中,我们将创建一个 Northwind Blazor WebAssembly 独立项目,作为 Northwind Web API 服务的客户端。让我们配置一个 HTTP 客户端:
- 使用您首选的代码编辑器打开 ModernWeb 解决方案,然后添加一个新项目,如下列表所定义:项目模板:Blazor WebAssembly 独立应用 / blazorwasm解决方案文件和文件夹: ModernWeb项目文件和文件夹: Northwind.WebApi.WasmClient认证类型:无配置为 HTTPS:已选择渐进式网络应用:已清除包含样本页面:已选择请勿使用顶级语句:已清除
- 在 Northwind.WebApi.WasmClient.csproj 项目文件中,在包引用中,删除版本属性。
- 在 Properties 文件夹中,在 launchSettings.json ,对于 https 配置文件,对于其 applicationUrl ,将 HTTPS 的随机端口号更改为 5152 ,将 HTTP 的随机端口号更改为 5153 ,如以下标记中突出显示的内容所示:
"applicationUrl": "https://localhost:5152;http://localhost:5153",
- 保存对所有已修改文件的更改。
- 在 Program.cs 中,在对 AddScoped 方法的调用中,添加一条语句以启用 HttpClientFactory ,使用命名客户端通过 HTTPS 在端口 5151 上调用 Northwind Web API 服务,并将 JSON 作为默认响应格式,如以下代码所示:
builder.Services.AddScoped(sp => new HttpClient {
BaseAddress = new Uri("https://localhost:5151/") });
在 Northwind.WebApi 项目中,在 Program.cs ,在文件顶部的命名空间导入之后,声明一个字符串常量用于 CORS 策略的名称,如以下代码所示:
const string corsPolicyName = "allowWasmClient";
在 Program.cs 中,在调用 Build 之前,添加 CORS 并配置策略,以允许来自与 Web 服务本身不同端口号的客户端的 HTTP 调用,如以下代码所示:
builder.Services.AddCors(options =>
{
options.AddPolicy(name: corsPolicyName,
policy =>
{
policy.WithOrigins("https://localhost:5152",
"http://localhost:5153");
});
});
在 Program.cs 中,在调用 UseHttpsRedirection 之后,启用带有命名策略的 CORS,如以下代码所示:
app.UseCors(corsPolicyName);
在 Blazor 组件中以 JSON 格式获取客户信息
我们现在可以创建一个客户端页面:
- 对客户发出 GET 请求。
- 使用.NET 5 在 System.Net.Http.Json 程序集和命名空间中引入的便捷扩展方法反序列化 JSON 响应。
我们走吧:
- 在 Northwind.WebApi.WasmClient.csproj 项目文件中,添加对实体模型项目的引用,如下标记所示:
在
Northwind.WebApi.WasmClient 项目中,在 _Imports.razor 中,导入用于处理实体模型的命名空间,如以下代码所示:
@using Northwind.EntityModels @* To use Customer. *@
- 在 Northwind.WebApi.WasmClient 项目中,在 Pages 文件夹内,添加一个名为 Customers.razor 的新文件。
- 在 Customers.razor 中,注入 HTTP 客户端服务,并使用它调用 Northwind Web API 服务,获取所有客户,并将其传递给一个表,如下所示的标记:
@attribute [StreamRendering]
@page "/customers/{country?}"
@inject HttpClient Http
Customers @(string.IsNullOrWhiteSpace(Country)
? "Worldwide" : "in " + Country)
@if (customers is null)
{
Loading...
}
else
{
Id
Company Name
Address
Phone
@foreach (Customer c in customers)
{
@c.CustomerId
@c.CompanyName
@c.Address
@c.City
@c.PostalCode
@c.Country
@c.Phone
}
}
@code {
[Parameter]
public string? Country { get; set; }
private IEnumerable? customers;
protected override async Task OnParametersSetAsync()
{
if (string.IsNullOrWhiteSpace(Country))
{
customers = await Http.GetFromJsonAsync
("/customers");
}
else
{
customers = await Http.GetFromJsonAsync
($"/customers/in/{Country}");
}
}
}
在 Layout 文件夹中,在 NavMenu.razor 中,将天气菜单项更改为显示客户,如以下标记所示:
Customers
启动多个项目
到目前为止,我们只启动了一个项目。现在我们有两个项目需要启动,一个是网络服务,另一个是 Blazor 客户端网站。在逐步说明中,我只会告诉你一次启动一个单独的项目,但你可以使用任何你喜欢的技术来启动它们。
如果您正在使用 Visual Studio
Visual Studio 可以在调试器未附加的情况下手动逐个启动多个项目,如下所述:
- 在解决方案资源管理器中,右键单击解决方案或任何项目,然后选择配置启动项目…,或选择解决方案并导航到项目 | 配置启动项目….
- 在解决方案‘’属性页对话框中,选择当前选择。
- 点击确定。
- 在解决方案资源管理器中选择一个项目,使其名称变为粗体。
- 导航到调试 | 无调试启动或按 Ctrl + F5。
- 对需要的项目重复步骤 2 和 3。
如果您需要调试项目,则必须启动多个 Visual Studio 实例。每个实例可以启动一个单独的项目进行调试。
您还可以使用以下步骤配置多个项目同时启动:
- 在解决方案资源管理器中,右键单击解决方案或任何项目,然后选择配置启动项目…,或选择解决方案并导航到项目 | 配置启动项目…。
- 在解决方案‘’属性页对话框中,选择多个启动项目,对于您想要启动的任何项目,选择“启动”或“无调试启动”,如图 15.6 所示:
- 点击确定。
- 导航到 调试 | 开始调试 或 调试 | 无调试开始,或单击工具栏中的相应按钮以启动您选择的所有项目。
您可以通过以下链接了解有关使用 Visual Studio 的多项目启动的更多信息:https://learn.microsoft.com/en-us/visualstudio/ide/how-to-set-multiple-startup-projects。
如果您正在使用 VS Code
如果您需要在命令行中使用 dotnet 启动多个项目,请编写一个脚本或批处理文件以执行多个 dotnet run 命令,或者打开多个命令提示符或终端窗口。
如果您需要使用 VS Code 调试多个项目,那么在启动第一个调试会话后,您可以直接启动另一个会话。一旦第二个会话正在运行,用户界面将切换到多目标模式。例如,在调用堆栈中,您将看到两个命名项目及其各自的线程,然后调试工具栏显示一个会话下拉列表,活动会话被选中。或者,您可以在 launch.json 中定义复合启动配置。
您可以通过以下链接了解有关使用 VS Code 进行多目标调试的更多信息:https://code.visualstudio.com/Docs/editor/debugging#_multitarget-debugging。
启动 Web 服务和 Blazor 客户端项目
现在我们可以尝试使用 Blazor 客户端调用该 Web 服务:
- 启动 Northwind.WebApi 项目,并确认网络服务正在 5151 和 5150 端口上监听,如下输出所示:
info: Microsoft.Hosting.Lifetime[14]
Now listening on: https://localhost:5151
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5150
启动
Northwind.WebApi.WasmClient 项目,并确认网站正在监听端口 5152 和 5153 ,如以下输出所示:
info: Microsoft.Hosting.Lifetime[14]
Now listening on: https://localhost:5152
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5153
- 启动 Chrome 并导航到 https://localhost:5152/ 。
- 在主页的左侧导航菜单中,点击客户,并注意客户列表,如图 15.7 所示:
在网络服务的命令提示符或终端中,请注意 HTTP 日志显示已成功为客户发出请求,如下所示的输出:
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (20ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT "c"."CustomerId", "c"."Address", "c"."City", "c"."CompanyName", "c"."ContactName", "c"."ContactTitle", "c"."Country", "c"."Fax", "c"."Phone", "c"."PostalCode", "c"."Region"
FROM "Customers" AS "c"
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
Response:
StatusCode: 200
Content-Type: application/json; charset=utf-8
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[4]
ResponseBody: [{"customerId":"ALFKI","companyName":"Alfreds Futterkiste","contactName":"Maria Anders","contactTitle":"Sales Representative","address":"Obere Str. 57","city":"Berlin","region":null,"postalCode":"12209","country":"Germany","phone":"030-0074321","fax":"030-0076545","orders":[]},...
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[8]
Duration: 1039.4409ms
- 在地址栏中,将路径更改为指定一个国家,例如 Germany 、 UK 或 USA ,例如: customers/UK 。按回车键,注意表格更新为仅显示英国客户。
- 关闭 Chrome 并关闭两个 Web 服务器。