本教程演示如何创建 .NET gRPC 客户端和 ASP.NET Core gRPC 服务器。 最后会生成与 gRPC Greeter 服务进行通信的 gRPC 客户端。
本教程介绍以下操作:
- 创建 gRPC 服务器。
- 创建 gRPC 客户端。
- 使用 gRPC Greeter 服务测试 gRPC 客户端。
Prerequisites
Visual Studio 2022 与“ASP.NET 和 Web 开发”工作负载。
创建 gRPC 服务
- 启动 Visual Studio 2022 并选择“ 新建项目”。
- 在“创建新项目”对话框中,搜索
gRPC
。 选择“ASP.NET Core gRPC 服务”,并选择“下一步”。 - 在“配置新项目”对话框中,为“项目名称”
GrpcGreeter
输入 。 请务必命名项目 GrpcGreeter ,以便在复制和粘贴代码时命名空间匹配。 - Select Next.
- 在“其他信息”对话框中,选择“.NET 9.0 (标准期限支持)”,然后选择“创建”。
运行服务
按 Ctrl+F5 以在不使用调试程序的情况下运行。
如果尚未将项目配置为使用 SSL,Visual Studio 显示以下对话:
如果信任 IIS Express SSL 证书,请选择“是”。
将显示以下对话框:
如果你同意信任开发证书,请选择“是”。
有关信任 Firefox 浏览器的信息,请参阅 Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 证书错误。
Visual Studio:
- 启动 Kestrel 服务器。
- 启动浏览器。
- 导航到
http://localhost:port
,如http://localhost:7042
。- 端口:应用的随机分配端口号。
-
localhost
:本地计算机的标准主机名。 Localhost 仅为来自本地计算机的 Web 请求提供服务。
日志显示在 https://localhost:<port>
上侦听的服务,其中 <port>
是在 Properties/launchSettings.json
中创建和设置项目时随机分配的 localhost 端口号。
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
Note
gRPC 模板配置为使用传输层安全性 (TLS)。 gRPC 客户端需要使用 HTTPS 调用服务器。 创建项目并在 gRPC 服务文件的 “属性”\launchSettings.js 中设置项目时,随机分配 gRPC 服务 localhost 端口号。
检查项目文件
GrpcGreeter 项目文件:
-
Protos/greet.proto
:定义Greeter
gRPC,并用于生成 gRPC 服务器资产。 有关详细信息,请参阅 gRPC 介绍。 -
Services
文件夹:包含Greeter
服务的实现。 -
appSettings.json
:包含配置数据,如 Kestrel 使用的协议。 有关详细信息,请参阅 ASP.NET Core 中的配置。 -
Program.cs
,其中包含:- gRPC 服务的入口点。 有关详细信息,请参阅 ASP.NET Core 中的 .NET 通用主机。
- 配置应用行为的代码。 有关详细信息,请参阅 应用启动。
在 .NET 控制台应用中创建 gRPC 客户端
- 打开 Visual Studio 的第二个实例,然后选择“ 新建项目”。
- 在“新建项目”对话框中,选择“控制台应用”,然后选择“下一步”。
- 在 “项目名称 ”文本框中,输入 GrpcGreeterClient ,然后选择“ 下一步”。
- 在“其他信息”对话框中,选择“.NET 9.0 (标准期限支持)”,然后选择“创建”。
添加所需的 NuGet 包
gRPC 客户端项目需要以下 NuGet 包:
- Grpc.Net.Client,其中包含 .NET 客户端。
- Google.Protobuf,其中包含适用于 C# 的 protobuf 消息 API。
-
Grpc.Tools,其中包含对 protobuf 文件的 C# 工具支持。 运行时不需要工具包,因此依赖项标记为
PrivateAssets="All"
。
通过包管理器控制台 (PMC) 或管理 NuGet 包来安装包。
用于安装包的 PMC 选项
在 Visual Studio 中,选择“工具>NuGet 包管理器包管理器>控制台”
从“包管理器控制台”窗口中,运行 以将目录更改为包含
cd GrpcGreeterClient
文件的文件夹GrpcGreeterClient.csproj
。运行以下命令:
Install-Package Grpc.Net.Client Install-Package Google.Protobuf Install-Package Grpc.Tools
管理 NuGet 包选项以安装包
- 右键单击 解决方案资源管理器>中的项目“管理 NuGet 包”。
- 选择“浏览”选项卡。
- 在搜索框中输入 Grpc.Net.Client 。
- 从“浏览”选项卡中选择 Grpc.Net.Client 包,然后选择“安装”。
- 对
Google.Protobuf
和Grpc.Tools
重复这些步骤。
Add greet.proto
在 gRPC 客户端项目中创建 Protos 文件夹。
将 Protos\greet.proto 文件从 gRPC Greeter 服务复制到 gRPC 客户端项目中的 Protos 文件夹。
将
greet.proto
文件中的命名空间更新为项目的命名空间:option csharp_namespace = "GrpcGreeterClient";
编辑
GrpcGreeterClient.csproj
项目文件:
右键单击项目,并选择“编辑项目文件”。
添加包含
<Protobuf>
引用 greet.proto 文件的元素的项组:<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>
创建 Greeter 客户端
- 构建客户端项目,以在
GrpcGreeterClient
命名空间中创建类型。
Note
GrpcGreeterClient
类型是由生成进程自动生成的。 工具包 Grpc.Tools 基于 greet.proto 文件生成以下文件:
-
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs
:用于填充、序列化和检索请求和响应消息类型的协议缓冲区代码。 -
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs
:包含生成的客户端类。
有关 Grpc.Tools 自动生成的 C# 资产的详细信息,请参阅 包含 C# 的 gRPC 服务:生成的 C# 资产。
使用以下代码更新 gRPC 客户端
Program.cs
文件。using Grpc.Net.Client; using GrpcGreeterClient; // The port number must match the port of the gRPC server. using var channel = GrpcChannel.ForAddress("https://localhost:7042"); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync( new HelloRequest { Name = "GreeterClient" }); Console.WriteLine("Greeting: " + reply.Message); Console.WriteLine("Press any key to exit..."); Console.ReadKey();
在前面突出显示的代码中,将 localhost 端口号
7042
替换为在HTTPS
服务项目的Properties/launchSettings.json
中指定的GrpcGreeter
端口号。
Program.cs
包含 gRPC 客户端的入口点和逻辑。
通过以下方式创建 Greeter 客户端:
- 实例化
GrpcChannel
,使其包含用于创建到 gRPC 服务的连接的信息。 - 使用
GrpcChannel
构造 Greeter 客户端:
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
Greeter 客户端会调用异步 SayHello
方法。 随即显示 SayHello
调用的结果:
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
使用 gRPC Greeter 服务测试 gRPC 客户端
通过添加以下突出显示的行来更新 appsettings.Development.json
文件:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Microsoft.AspNetCore.Hosting": "Information",
"Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"
}
}
}
- 在
GrpcGreeter
服务项目中,按Ctrl+F5
以在没有调试器的情况下启动服务器。 - 在
GrpcGreeterClient
控制台项目中,按Ctrl+F5
以在没有调试器的情况下启动客户端。
客户端向服务发送问候语,其中包含其名称 GreeterClient 的消息。 该服务会发送“Hello GreeterClient”消息作为答复。 “Hello GreeterClient”答复将在命令提示符中显示:
Greeting: Hello GreeterClient
Press any key to exit...
gRPC 服务在写入命令提示符的日志中记录成功调用的详细信息:
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:<port>
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:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/2 POST https://localhost:<port>/greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
Executing endpoint 'gRPC - /greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint 'gRPC - /greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished HTTP/2 POST https://localhost:7042/greet.Greeter/SayHello - 200 - application/grpc 40.4615ms
Note
本文中的代码需要 ASP.NET Core HTTPS 开发证书来保护 gRPC 服务。 如果 .NET gRPC 客户端失败并显示消息 The remote certificate is invalid according to the validation procedure.
或 The SSL connection could not be established.
,则开发证书不受信任。 要解决此问题,请参阅使用不受信任/无效的证书调用 gRPC 服务。
Next steps
本教程演示如何创建 .NET gRPC 客户端和 ASP.NET Core gRPC 服务器。 最后会生成与 gRPC Greeter 服务进行通信的 gRPC 客户端。
本教程介绍以下操作:
- 创建 gRPC 服务器。
- 创建 gRPC 客户端。
- 使用 gRPC Greeter 服务测试 gRPC 客户端。
Prerequisites
Visual Studio 2022 与“ASP.NET 和 Web 开发”工作负载。
创建 gRPC 服务
- 启动 Visual Studio 2022 并选择“ 新建项目”。
- 在“创建新项目”对话框中,搜索
gRPC
。 选择“ASP.NET Core gRPC 服务”,并选择“下一步”。 - 在“配置新项目”对话框中,为“项目名称”
GrpcGreeter
输入 。 请务必命名项目 GrpcGreeter ,以便在复制和粘贴代码时命名空间匹配。 - Select Next.
- 在 “其他信息 ”对话框中,选择 “.NET 8.0”(长期支持), 然后选择“ 创建”。
运行服务
按 Ctrl+F5 以在不使用调试程序的情况下运行。
如果尚未将项目配置为使用 SSL,Visual Studio 显示以下对话:
如果信任 IIS Express SSL 证书,请选择“是”。
将显示以下对话框:
如果你同意信任开发证书,请选择“是”。
有关信任 Firefox 浏览器的信息,请参阅 Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 证书错误。
Visual Studio:
- 启动 Kestrel 服务器。
- 启动浏览器。
- 导航到
http://localhost:port
,如http://localhost:7042
。- 端口:应用的随机分配端口号。
-
localhost
:本地计算机的标准主机名。 Localhost 仅为来自本地计算机的 Web 请求提供服务。
日志显示在 https://localhost:<port>
上侦听的服务,其中 <port>
是在 Properties/launchSettings.json
中创建和设置项目时随机分配的 localhost 端口号。
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
Note
gRPC 模板配置为使用传输层安全性 (TLS)。 gRPC 客户端需要使用 HTTPS 调用服务器。 创建项目并在 gRPC 服务文件的 “属性”\launchSettings.js 中设置项目时,随机分配 gRPC 服务 localhost 端口号。
检查项目文件
GrpcGreeter 项目文件:
-
Protos/greet.proto
:定义Greeter
gRPC,并用于生成 gRPC 服务器资产。 有关详细信息,请参阅 gRPC 介绍。 -
Services
文件夹:包含Greeter
服务的实现。 -
appSettings.json
:包含配置数据,如 Kestrel 使用的协议。 有关详细信息,请参阅 ASP.NET Core 中的配置。 -
Program.cs
,其中包含:- gRPC 服务的入口点。 有关详细信息,请参阅 ASP.NET Core 中的 .NET 通用主机。
- 配置应用行为的代码。 有关详细信息,请参阅 应用启动。
在 .NET 控制台应用中创建 gRPC 客户端
- 打开 Visual Studio 的第二个实例,然后选择“ 新建项目”。
- 在“新建项目”对话框中,选择“控制台应用”,然后选择“下一步”。
- 在 “项目名称 ”文本框中,输入 GrpcGreeterClient ,然后选择“ 下一步”。
- 在 “其他信息 ”对话框中,选择 “.NET 8.0”(长期支持), 然后选择“ 创建”。
添加所需的 NuGet 包
gRPC 客户端项目需要以下 NuGet 包:
- Grpc.Net.Client,其中包含 .NET 客户端。
- Google.Protobuf,其中包含适用于 C# 的 protobuf 消息 API。
-
Grpc.Tools,其中包含对 protobuf 文件的 C# 工具支持。 运行时不需要工具包,因此依赖项标记为
PrivateAssets="All"
。
通过包管理器控制台 (PMC) 或管理 NuGet 包来安装包。
用于安装包的 PMC 选项
在 Visual Studio 中,选择“工具>NuGet 包管理器包管理器>控制台”
从“包管理器控制台”窗口中,运行 以将目录更改为包含
cd GrpcGreeterClient
文件的文件夹GrpcGreeterClient.csproj
。运行以下命令:
Install-Package Grpc.Net.Client Install-Package Google.Protobuf Install-Package Grpc.Tools
管理 NuGet 包选项以安装包
- 右键单击 解决方案资源管理器>中的项目“管理 NuGet 包”。
- 选择“浏览”选项卡。
- 在搜索框中输入 Grpc.Net.Client 。
- 从“浏览”选项卡中选择 Grpc.Net.Client 包,然后选择“安装”。
- 对
Google.Protobuf
和Grpc.Tools
重复这些步骤。
Add greet.proto
在 gRPC 客户端项目中创建 Protos 文件夹。
将 Protos\greet.proto 文件从 gRPC Greeter 服务复制到 gRPC 客户端项目中的 Protos 文件夹。
将
greet.proto
文件中的命名空间更新为项目的命名空间:option csharp_namespace = "GrpcGreeterClient";
编辑
GrpcGreeterClient.csproj
项目文件:
右键单击项目,并选择“编辑项目文件”。
添加包含
<Protobuf>
引用 greet.proto 文件的元素的项组:<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>
创建 Greeter 客户端
- 构建客户端项目,以在
GrpcGreeterClient
命名空间中创建类型。
Note
GrpcGreeterClient
类型是由生成进程自动生成的。 工具包 Grpc.Tools 基于 greet.proto 文件生成以下文件:
-
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs
:用于填充、序列化和检索请求和响应消息类型的协议缓冲区代码。 -
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs
:包含生成的客户端类。
有关 Grpc.Tools 自动生成的 C# 资产的详细信息,请参阅 包含 C# 的 gRPC 服务:生成的 C# 资产。
使用以下代码更新 gRPC 客户端
Program.cs
文件。using System.Threading.Tasks; using Grpc.Net.Client; using GrpcGreeterClient; // The port number must match the port of the gRPC server. using var channel = GrpcChannel.ForAddress("https://localhost:7042"); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync( new HelloRequest { Name = "GreeterClient" }); Console.WriteLine("Greeting: " + reply.Message); Console.WriteLine("Press any key to exit..."); Console.ReadKey();
在前面突出显示的代码中,将 localhost 端口号
7042
替换为在HTTPS
服务项目的Properties/launchSettings.json
中指定的GrpcGreeter
端口号。
Program.cs
包含 gRPC 客户端的入口点和逻辑。
通过以下方式创建 Greeter 客户端:
- 实例化
GrpcChannel
,使其包含用于创建到 gRPC 服务的连接的信息。 - 使用
GrpcChannel
构造 Greeter 客户端:
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
Greeter 客户端会调用异步 SayHello
方法。 随即显示 SayHello
调用的结果:
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
使用 gRPC Greeter 服务测试 gRPC 客户端
通过添加以下突出显示的行来更新 appsettings.Development.json
文件:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
,"Microsoft.AspNetCore.Hosting": "Information",
"Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"
}
}
}
- 在 Greeter 服务中,按
Ctrl+F5
在不使用调试程序的情况下启动服务器。 - 在
GrpcGreeterClient
项目中,按Ctrl+F5
在不使用调试程序的情况下启动客户端。
客户端向服务发送问候语,其中包含其名称 GreeterClient 的消息。 该服务会发送“Hello GreeterClient”消息作为答复。 “Hello GreeterClient”答复将在命令提示符中显示:
Greeting: Hello GreeterClient
Press any key to exit...
gRPC 服务在写入命令提示符的日志中记录成功调用的详细信息:
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:<port>
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:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/2 POST https://localhost:<port>/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished in 78.32260000000001ms 200 application/grpc
Note
本文中的代码需要 ASP.NET Core HTTPS 开发证书来保护 gRPC 服务。 如果 .NET gRPC 客户端失败并显示消息 The remote certificate is invalid according to the validation procedure.
或 The SSL connection could not be established.
,则开发证书不受信任。 要解决此问题,请参阅使用不受信任/无效的证书调用 gRPC 服务。
Next steps
本教程演示如何创建 .NET gRPC 客户端和 ASP.NET Core gRPC 服务器。 最后会生成与 gRPC Greeter 服务进行通信的 gRPC 客户端。
本教程介绍以下操作:
- 创建 gRPC 服务器。
- 创建 gRPC 客户端。
- 使用 gRPC Greeter 服务测试 gRPC 客户端。
Prerequisites
Visual Studio 2022 与“ASP.NET 和 Web 开发”工作负载。
创建 gRPC 服务
- 启动 Visual Studio 2022 并选择“创建新项目”。
- 在“创建新项目”对话框中,搜索
gRPC
。 选择“ASP.NET Core gRPC 服务”,并选择“下一步”。 - 在“配置新项目”对话框中,为“项目名称”
GrpcGreeter
输入 。 请务必命名项目 GrpcGreeter ,以便在复制和粘贴代码时命名空间匹配。 - Select Next.
- 在 “其他信息 ”对话框中,选择 “.NET 6.0”(长期支持), 然后选择“ 创建”。
运行服务
按 Ctrl+F5 以在不使用调试程序的情况下运行。
如果尚未将项目配置为使用 SSL,Visual Studio 显示以下对话:
如果信任 IIS Express SSL 证书,请选择“是”。
将显示以下对话框:
如果你同意信任开发证书,请选择“是”。
有关信任 Firefox 浏览器的信息,请参阅 Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 证书错误。
Visual Studio:
- 启动 Kestrel 服务器。
- 启动浏览器。
- 导航到
http://localhost:port
,如http://localhost:7042
。- 端口:应用的随机分配端口号。
-
localhost
:本地计算机的标准主机名。 Localhost 仅为来自本地计算机的 Web 请求提供服务。
日志显示在 https://localhost:<port>
上侦听的服务,其中 <port>
是在 Properties/launchSettings.json
中创建和设置项目时随机分配的 localhost 端口号。
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
Note
gRPC 模板配置为使用传输层安全性 (TLS)。 gRPC 客户端需要使用 HTTPS 调用服务器。 创建项目并在 gRPC 服务文件的 “属性”\launchSettings.js 中设置项目时,随机分配 gRPC 服务 localhost 端口号。
macOS 不支持 ASP.NET Core gRPC 及 TLS。 在 macOS 上成功运行 gRPC 服务需要其他配置。 有关详细信息,请参阅无法在 macOS 上启用 ASP.NET Core gRPC 应用。
检查项目文件
GrpcGreeter 项目文件:
-
Protos/greet.proto
:定义Greeter
gRPC,并用于生成 gRPC 服务器资产。 有关详细信息,请参阅 gRPC 介绍。 -
Services
文件夹:包含Greeter
服务的实现。 -
appSettings.json
:包含配置数据,如 Kestrel 使用的协议。 有关详细信息,请参阅 ASP.NET Core 中的配置。 -
Program.cs
,其中包含:- gRPC 服务的入口点。 有关详细信息,请参阅 ASP.NET Core 中的 .NET 通用主机。
- 配置应用行为的代码。 有关详细信息,请参阅 应用启动。
在 .NET 控制台应用中创建 gRPC 客户端
- 打开 Visual Studio 的第二个实例并选择“创建新项目”。
- 在“创建新项目”对话框中,选择“控制台应用程序”,然后选择“下一步”。
- 在 “项目名称 ”文本框中,输入 GrpcGreeterClient ,然后选择“ 下一步”。
- 在 “其他信息 ”对话框中,选择 “.NET 6.0”(长期支持), 然后选择“ 创建”。
添加所需的 NuGet 包
gRPC 客户端项目需要以下 NuGet 包:
- Grpc.Net.Client,其中包含 .NET 客户端。
- Google.Protobuf,其中包含适用于 C# 的 protobuf 消息 API。
-
Grpc.Tools,其中包含对 protobuf 文件的 C# 工具支持。 运行时不需要工具包,因此依赖项标记为
PrivateAssets="All"
。
通过包管理器控制台 (PMC) 或管理 NuGet 包来安装包。
用于安装包的 PMC 选项
在 Visual Studio 中,选择“工具>NuGet 包管理器包管理器>控制台”
从“包管理器控制台”窗口中,运行 以将目录更改为包含
cd GrpcGreeterClient
文件的文件夹GrpcGreeterClient.csproj
。运行以下命令:
Install-Package Grpc.Net.Client Install-Package Google.Protobuf Install-Package Grpc.Tools
管理 NuGet 包选项以安装包
- 右键单击 解决方案资源管理器>中的项目“管理 NuGet 包”。
- 选择“浏览”选项卡。
- 在搜索框中输入 Grpc.Net.Client 。
- 从“浏览”选项卡中选择 Grpc.Net.Client 包,然后选择“安装”。
- 对
Google.Protobuf
和Grpc.Tools
重复这些步骤。
Add greet.proto
在 gRPC 客户端项目中创建 Protos 文件夹。
将 Protos\greet.proto 文件从 gRPC Greeter 服务复制到 gRPC 客户端项目中的 Protos 文件夹。
将
greet.proto
文件中的命名空间更新为项目的命名空间:option csharp_namespace = "GrpcGreeterClient";
编辑
GrpcGreeterClient.csproj
项目文件:
右键单击项目,并选择“编辑项目文件”。
添加包含
<Protobuf>
引用 greet.proto 文件的元素的项组:<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>
创建 Greeter 客户端
- 构建客户端项目,以在
GrpcGreeterClient
命名空间中创建类型。
Note
GrpcGreeterClient
类型是由生成进程自动生成的。 工具包 Grpc.Tools 基于 greet.proto 文件生成以下文件:
-
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs
:用于填充、序列化和检索请求和响应消息类型的协议缓冲区代码。 -
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs
:包含生成的客户端类。
有关 Grpc.Tools 自动生成的 C# 资产的详细信息,请参阅 包含 C# 的 gRPC 服务:生成的 C# 资产。
使用以下代码更新 gRPC 客户端
Program.cs
文件。using System.Threading.Tasks; using Grpc.Net.Client; using GrpcGreeterClient; // The port number must match the port of the gRPC server. using var channel = GrpcChannel.ForAddress("https://localhost:7042"); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync( new HelloRequest { Name = "GreeterClient" }); Console.WriteLine("Greeting: " + reply.Message); Console.WriteLine("Press any key to exit..."); Console.ReadKey();
在前面突出显示的代码中,将 localhost 端口号
7042
替换为在HTTPS
服务项目的Properties/launchSettings.json
中指定的GrpcGreeter
端口号。
Program.cs
包含 gRPC 客户端的入口点和逻辑。
通过以下方式创建 Greeter 客户端:
- 实例化
GrpcChannel
,使其包含用于创建到 gRPC 服务的连接的信息。 - 使用
GrpcChannel
构造 Greeter 客户端:
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
Greeter 客户端会调用异步 SayHello
方法。 随即显示 SayHello
调用的结果:
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
使用 gRPC Greeter 服务测试 gRPC 客户端
通过添加以下突出显示的行来更新 appsettings.Development.json
文件:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
,"Microsoft.AspNetCore.Hosting": "Information",
"Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"
}
}
}
- 在 Greeter 服务中,按
Ctrl+F5
在不使用调试程序的情况下启动服务器。 - 在
GrpcGreeterClient
项目中,按Ctrl+F5
在不使用调试程序的情况下启动客户端。
客户端向服务发送问候语,其中包含其名称 GreeterClient 的消息。 该服务会发送“Hello GreeterClient”消息作为答复。 “Hello GreeterClient”答复将在命令提示符中显示:
Greeting: Hello GreeterClient
Press any key to exit...
gRPC 服务在写入命令提示符的日志中记录成功调用的详细信息:
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:<port>
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:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/2 POST https://localhost:<port>/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished in 78.32260000000001ms 200 application/grpc
Note
本文中的代码需要 ASP.NET Core HTTPS 开发证书来保护 gRPC 服务。 如果 .NET gRPC 客户端失败并显示消息 The remote certificate is invalid according to the validation procedure.
或 The SSL connection could not be established.
,则开发证书不受信任。 要解决此问题,请参阅使用不受信任/无效的证书调用 gRPC 服务。
Next steps
本教程演示如何创建 .NET gRPC 客户端和 ASP.NET Core gRPC 服务器。 最后会生成与 gRPC Greeter 服务进行通信的 gRPC 客户端。
本教程介绍以下操作:
- 创建 gRPC 服务器。
- 创建 gRPC 客户端。
- 使用 gRPC Greeter 服务测试 gRPC 客户端。
Prerequisites
- Visual Studio 2022 与“ASP.NET 和 Web 开发”工作负载。
- .NET 6 SDK
创建 gRPC 服务
- 启动 Visual Studio 2022 并选择“创建新项目”。
- 在“创建新项目”对话框中,搜索
gRPC
。 选择“ASP.NET Core gRPC 服务”,并选择“下一步”。 - 在“配置新项目”对话框中,为“项目名称”
GrpcGreeter
输入 。 请务必命名项目 GrpcGreeter ,以便在复制和粘贴代码时命名空间匹配。 - Select Next.
- 在 “其他信息 ”对话框中,选择 “.NET 6.0”(长期支持), 然后选择“ 创建”。
运行服务
按 Ctrl+F5 以在不使用调试程序的情况下运行。
如果尚未将项目配置为使用 SSL,Visual Studio 显示以下对话:
如果信任 IIS Express SSL 证书,请选择“是”。
将显示以下对话框:
如果你同意信任开发证书,请选择“是”。
有关信任 Firefox 浏览器的信息,请参阅 Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 证书错误。
Visual Studio:
- 启动 Kestrel 服务器。
- 启动浏览器。
- 导航到
http://localhost:port
,如http://localhost:7042
。- 端口:应用的随机分配端口号。
-
localhost
:本地计算机的标准主机名。 Localhost 仅为来自本地计算机的 Web 请求提供服务。
日志显示在 https://localhost:<port>
上侦听的服务,其中 <port>
是在 Properties/launchSettings.json
中创建和设置项目时随机分配的 localhost 端口号。
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
Note
gRPC 模板配置为使用传输层安全性 (TLS)。 gRPC 客户端需要使用 HTTPS 调用服务器。 创建项目并在 gRPC 服务文件的 “属性”\launchSettings.js 中设置项目时,随机分配 gRPC 服务 localhost 端口号。
macOS 不支持 ASP.NET Core gRPC 及 TLS。 在 macOS 上成功运行 gRPC 服务需要其他配置。 有关详细信息,请参阅无法在 macOS 上启用 ASP.NET Core gRPC 应用。
检查项目文件
GrpcGreeter 项目文件:
-
Protos/greet.proto
:定义Greeter
gRPC,并用于生成 gRPC 服务器资产。 有关详细信息,请参阅 gRPC 介绍。 -
Services
文件夹:包含Greeter
服务的实现。 -
appSettings.json
:包含配置数据,如 Kestrel 使用的协议。 有关详细信息,请参阅 ASP.NET Core 中的配置。 -
Program.cs
,其中包含:- gRPC 服务的入口点。 有关详细信息,请参阅 ASP.NET Core 中的 .NET 通用主机。
- 配置应用行为的代码。 有关详细信息,请参阅 应用启动。
在 .NET 控制台应用中创建 gRPC 客户端
- 打开 Visual Studio 的第二个实例并选择“创建新项目”。
- 在“创建新项目”对话框中,选择“控制台应用程序”,然后选择“下一步”。
- 在 “项目名称 ”文本框中,输入 GrpcGreeterClient ,然后选择“ 下一步”。
- 在 “其他信息 ”对话框中,选择 “.NET 6.0”(长期支持), 然后选择“ 创建”。
添加所需的 NuGet 包
gRPC 客户端项目需要以下 NuGet 包:
- Grpc.Net.Client,其中包含 .NET 客户端。
- Google.Protobuf,其中包含适用于 C# 的 protobuf 消息 API。
-
Grpc.Tools,其中包含对 protobuf 文件的 C# 工具支持。 运行时不需要工具包,因此依赖项标记为
PrivateAssets="All"
。
通过包管理器控制台 (PMC) 或管理 NuGet 包来安装包。
用于安装包的 PMC 选项
在 Visual Studio 中,选择“工具>NuGet 包管理器包管理器>控制台”
从“包管理器控制台”窗口中,运行 以将目录更改为包含
cd GrpcGreeterClient
文件的文件夹GrpcGreeterClient.csproj
。运行以下命令:
Install-Package Grpc.Net.Client Install-Package Google.Protobuf Install-Package Grpc.Tools
管理 NuGet 包选项以安装包
- 右键单击 解决方案资源管理器>中的项目“管理 NuGet 包”。
- 选择“浏览”选项卡。
- 在搜索框中输入 Grpc.Net.Client 。
- 从“浏览”选项卡中选择 Grpc.Net.Client 包,然后选择“安装”。
- 对
Google.Protobuf
和Grpc.Tools
重复这些步骤。
Add greet.proto
在 gRPC 客户端项目中创建 Protos 文件夹。
将 Protos\greet.proto 文件从 gRPC Greeter 服务复制到 gRPC 客户端项目中的 Protos 文件夹。
将
greet.proto
文件中的命名空间更新为项目的命名空间:option csharp_namespace = "GrpcGreeterClient";
编辑
GrpcGreeterClient.csproj
项目文件:
右键单击项目,并选择“编辑项目文件”。
添加包含
<Protobuf>
引用 greet.proto 文件的元素的项组:<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>
创建 Greeter 客户端
- 构建客户端项目,以在
GrpcGreeterClient
命名空间中创建类型。
Note
GrpcGreeterClient
类型是由生成进程自动生成的。 工具包 Grpc.Tools 基于 greet.proto 文件生成以下文件:
-
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs
:用于填充、序列化和检索请求和响应消息类型的协议缓冲区代码。 -
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs
:包含生成的客户端类。
有关 Grpc.Tools 自动生成的 C# 资产的详细信息,请参阅 包含 C# 的 gRPC 服务:生成的 C# 资产。
使用以下代码更新 gRPC 客户端
Program.cs
文件。using System.Threading.Tasks; using Grpc.Net.Client; using GrpcGreeterClient; // The port number must match the port of the gRPC server. using var channel = GrpcChannel.ForAddress("https://localhost:7042"); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync( new HelloRequest { Name = "GreeterClient" }); Console.WriteLine("Greeting: " + reply.Message); Console.WriteLine("Press any key to exit..."); Console.ReadKey();
在前面突出显示的代码中,将 localhost 端口号
7042
替换为在HTTPS
服务项目的Properties/launchSettings.json
中指定的GrpcGreeter
端口号。
Program.cs
包含 gRPC 客户端的入口点和逻辑。
通过以下方式创建 Greeter 客户端:
- 实例化
GrpcChannel
,使其包含用于创建到 gRPC 服务的连接的信息。 - 使用
GrpcChannel
构造 Greeter 客户端:
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
Greeter 客户端会调用异步 SayHello
方法。 随即显示 SayHello
调用的结果:
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
使用 gRPC Greeter 服务测试 gRPC 客户端
- 在 Greeter 服务中,按
Ctrl+F5
在不使用调试程序的情况下启动服务器。 - 在
GrpcGreeterClient
项目中,按Ctrl+F5
在不使用调试程序的情况下启动客户端。
客户端向服务发送问候语,其中包含其名称 GreeterClient 的消息。 该服务会发送“Hello GreeterClient”消息作为答复。 “Hello GreeterClient”答复将在命令提示符中显示:
Greeting: Hello GreeterClient
Press any key to exit...
gRPC 服务在写入命令提示符的日志中记录成功调用的详细信息:
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:<port>
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:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/2 POST https://localhost:<port>/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished in 78.32260000000001ms 200 application/grpc
通过添加以下行来更新 appsettings.Development.json
文件:
"Microsoft.AspNetCore.Hosting": "Information",
"Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"
Note
本文中的代码需要 ASP.NET Core HTTPS 开发证书来保护 gRPC 服务。 如果 .NET gRPC 客户端失败并显示消息 The remote certificate is invalid according to the validation procedure.
或 The SSL connection could not be established.
,则开发证书不受信任。 要解决此问题,请参阅使用不受信任/无效的证书调用 gRPC 服务。
Next steps
本教程演示如何创建 .NET gRPC 客户端和 ASP.NET Core gRPC 服务器。
最后会生成与 gRPC Greeter 服务进行通信的 gRPC 客户端。
本教程介绍以下操作:
- 创建 gRPC 服务器。
- 创建 gRPC 客户端。
- 使用 gRPC Greeter 服务测试 gRPC 客户端。
Prerequisites
- 具有 ASP.NET 和 Web 开发工作负载的 Visual Studio 2019 16.8 或更高版本
- .NET 5 SDK
创建 gRPC 服务
- 启动 Visual Studio 并选择“创建新项目”。
- 在“创建新项目”对话框中,选择“gRPC 服务”,然后选择“下一步”。
- 在“配置新项目”对话框中,为“项目名称”
GrpcGreeter
输入 。 请务必命名项目 GrpcGreeter ,以便在复制和粘贴代码时命名空间匹配。 - Select Next.
- 在“其他信息”对话框中,在“目标框架”下拉列表中选择 .NET 5.0。
- Select Create.
运行服务
按 Ctrl+F5 以在不使用调试程序的情况下运行。
如果尚未将项目配置为使用 SSL,Visual Studio 显示以下对话:
如果信任 IIS Express SSL 证书,请选择“是”。
将显示以下对话框:
如果你同意信任开发证书,请选择“是”。
有关信任 Firefox 浏览器的信息,请参阅 Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 证书错误。
Visual Studio 启动 IIS Express 并运行应用。 地址栏显示
localhost:port#
,而不是显示example.com
。 这是因为localhost
是本地计算机的标准主机名。 Localhost 仅为来自本地计算机的 Web 请求提供服务。 Visual Studio 创建 Web 项目时,Web 服务器使用的是随机端口。
日志显示该服务正在侦听 https://localhost:5001
。
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
Note
gRPC 模板配置为使用传输层安全性 (TLS)。 gRPC 客户端需要使用 HTTPS 调用服务器。
macOS 不支持 ASP.NET Core gRPC 及 TLS。 在 macOS 上成功运行 gRPC 服务需要其他配置。 有关详细信息,请参阅无法在 macOS 上启用 ASP.NET Core gRPC 应用。
检查项目文件
GrpcGreeter 项目文件:
-
greet.proto: Protos/greet.proto 文件定义
Greeter
gRPC,用于生成 gRPC 服务器资产。 有关详细信息,请参阅 gRPC 介绍。 -
服务 文件夹:包含服务的实现
Greeter
。 -
appsettings.json
:包含配置数据,例如 Kestrel 使用的协议。 有关详细信息,请参阅 ASP.NET Core 中的配置。 -
Program.cs
:包含 gRPC 服务的入口点。 有关详细信息,请参阅 ASP.NET Core 中的 .NET 通用主机。 -
Startup.cs
:包含配置应用行为的代码。 有关详细信息,请参阅 应用启动。
在 .NET 控制台应用中创建 gRPC 客户端
- 打开 Visual Studio 的第二个实例并选择“创建新项目”。
- 在“ 创建新项目 ”对话框中,选择 “控制台应用”(.NET), 然后选择“ 下一步”。
- 在 “项目名称 ”文本框中,输入 GrpcGreeterClient 并选择“ 创建”。
添加所需的包
gRPC 客户端项目需要以下包:
- Grpc.Net.Client,其中包含 .NET 客户端。
- Google.Protobuf,其中包含适用于 C# 的 protobuf 消息 API。
-
Grpc.Tools,其中包含对 protobuf 文件的 C# 工具支持。 运行时不需要工具包,因此依赖项标记为
PrivateAssets="All"
。
通过包管理器控制台 (PMC) 或管理 NuGet 包来安装包。
用于安装包的 PMC 选项
在 Visual Studio 中,选择“工具>NuGet 包管理器包管理器>控制台”
从“包管理器控制台”窗口中,运行 以将目录更改为包含
cd GrpcGreeterClient
文件的文件夹GrpcGreeterClient.csproj
。运行以下命令:
Install-Package Grpc.Net.Client Install-Package Google.Protobuf Install-Package Grpc.Tools
管理 NuGet 包选项以安装包
- 右键单击 解决方案资源管理器>中的项目“管理 NuGet 包”。
- 选择“浏览”选项卡。
- 在搜索框中输入 Grpc.Net.Client 。
- 从“浏览”选项卡中选择 Grpc.Net.Client 包,然后选择“安装”。
- 对
Google.Protobuf
和Grpc.Tools
重复这些步骤。
Add greet.proto
在 gRPC 客户端项目中创建 Protos 文件夹。
将 Protos\greet.proto 文件从 gRPC Greeter 服务复制到 gRPC 客户端项目中的 Protos 文件夹。
将
greet.proto
文件中的命名空间更新为项目的命名空间:option csharp_namespace = "GrpcGreeterClient";
编辑
GrpcGreeterClient.csproj
项目文件:右键单击项目,并选择“编辑项目文件”。
添加包含
<Protobuf>
引用 greet.proto 文件的元素的项组:<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>
创建 Greeter 客户端
- 构建客户端项目,以在
GrpcGreeterClient
命名空间中创建类型。
Note
GrpcGreeterClient
类型是由生成进程自动生成的。 工具包 Grpc.Tools 基于 greet.proto 文件生成以下文件:
-
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs
:用于填充、序列化和检索请求和响应消息类型的协议缓冲区代码。 -
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs
:包含生成的客户端类。
有关 Grpc.Tools 自动生成的 C# 资产的详细信息,请参阅 包含 C# 的 gRPC 服务:生成的 C# 资产。
使用以下代码更新 gRPC 客户端
Program.cs
文件:using System; using System.Net.Http; using System.Threading.Tasks; using Grpc.Net.Client; namespace GrpcGreeterClient { class Program { static async Task Main(string[] args) { // The port number(5001) must match the port of the gRPC server. using var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync( new HelloRequest { Name = "GreeterClient" }); Console.WriteLine("Greeting: " + reply.Message); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } } }
Program.cs
包含 gRPC 客户端的入口点和逻辑。
通过以下方式创建 Greeter 客户端:
- 实例化
GrpcChannel
,使其包含用于创建到 gRPC 服务的连接的信息。 - 使用
GrpcChannel
构造 Greeter 客户端:
static async Task Main(string[] args)
{
// The port number(5001) must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
Greeter 客户端会调用异步 SayHello
方法。 随即显示 SayHello
调用的结果:
static async Task Main(string[] args)
{
// The port number(5001) must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
使用 gRPC Greeter 服务测试 gRPC 客户端
- 在 Greeter 服务中,按
Ctrl+F5
在不使用调试程序的情况下启动服务器。 - 在
GrpcGreeterClient
项目中,按Ctrl+F5
在不使用调试程序的情况下启动客户端。
客户端向服务发送问候语,其中包含其名称 GreeterClient 的消息。 该服务会发送“Hello GreeterClient”消息作为答复。 “Hello GreeterClient”答复将在命令提示符中显示:
Greeting: Hello GreeterClient
Press any key to exit...
gRPC 服务在写入命令提示符的日志中记录成功调用的详细信息:
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:5001
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:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/2 POST https://localhost:5001/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished in 78.32260000000001ms 200 application/grpc
Note
本文中的代码需要 ASP.NET Core HTTPS 开发证书来保护 gRPC 服务。 如果 .NET gRPC 客户端失败并显示消息 The remote certificate is invalid according to the validation procedure.
或 The SSL connection could not be established.
,则开发证书不受信任。 要解决此问题,请参阅使用不受信任/无效的证书调用 gRPC 服务。
Next steps
本教程演示如何创建 .NET Core gRPC 客户端和 ASP.NET Core gRPC 服务器。
最后会生成与 gRPC Greeter 服务进行通信的 gRPC 客户端。
本教程介绍以下操作:
- 创建 gRPC 服务器。
- 创建 gRPC 客户端。
- 使用 gRPC Greeter 服务测试 gRPC 客户端。
Prerequisites
- 具有 ASP.NET 和 Web 开发工作负载的 Visual Studio 2019 16.4 或更高版本
- .NET Core 3.1 SDK
创建 gRPC 服务
启动 Visual Studio 并选择“创建新项目”。 或者,在 Visual Studio 文件 菜单中,选择“ 新建>项目”。
在“创建新项目”对话框中,选择“gRPC 服务”,然后选择“下一步”:
将项目命名为 GrpcGreeter。 请务必命名项目 GrpcGreeter ,以便在复制和粘贴代码时命名空间匹配。
Select Create.
在“创建新 gRPC 服务”对话框中:
- 已选择 gRPC 服务 模板。
- Select Create.
运行服务
按 Ctrl+F5 以在不使用调试程序的情况下运行。
如果尚未将项目配置为使用 SSL,Visual Studio 显示以下对话:
如果信任 IIS Express SSL 证书,请选择“是”。
将显示以下对话框:
如果你同意信任开发证书,请选择“是”。
有关信任 Firefox 浏览器的信息,请参阅 Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 证书错误。
Visual Studio 启动 IIS Express 并运行应用。 地址栏显示
localhost:port#
,而不是显示example.com
。 这是因为localhost
是本地计算机的标准主机名。 Localhost 仅为来自本地计算机的 Web 请求提供服务。 Visual Studio 创建 Web 项目时,Web 服务器使用的是随机端口。
日志显示该服务正在侦听 https://localhost:5001
。
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
Note
gRPC 模板配置为使用传输层安全性 (TLS)。 gRPC 客户端需要使用 HTTPS 调用服务器。
macOS 不支持 ASP.NET Core gRPC 及 TLS。 在 macOS 上成功运行 gRPC 服务需要其他配置。 有关详细信息,请参阅无法在 macOS 上启用 ASP.NET Core gRPC 应用。
检查项目文件
GrpcGreeter 项目文件:
-
greet.proto: Protos/greet.proto 文件定义
Greeter
gRPC,用于生成 gRPC 服务器资产。 有关详细信息,请参阅 gRPC 介绍。 -
服务 文件夹:包含服务的实现
Greeter
。 -
appsettings.json
:包含配置数据,例如 Kestrel 使用的协议。 有关详细信息,请参阅 ASP.NET Core 中的配置。 -
Program.cs
:包含 gRPC 服务的入口点。 有关详细信息,请参阅 ASP.NET Core 中的 .NET 通用主机。 -
Startup.cs
:包含配置应用行为的代码。 有关详细信息,请参阅 应用启动。
在 .NET 控制台应用中创建 gRPC 客户端
- 打开 Visual Studio 的第二个实例并选择“创建新项目”。
- 在“创建新项目”对话框中,选择“控制台应用(.NET Core)”,然后选择“下一步”。
- 在 “项目名称 ”文本框中,输入 GrpcGreeterClient 并选择“ 创建”。
添加所需的包
gRPC 客户端项目需要以下包:
- Grpc.Net.Client,其中包含 .NET Core 客户端。
- Google.Protobuf,其中包含适用于 C# 的 protobuf 消息 API。
-
Grpc.Tools,其中包含对 protobuf 文件的 C# 工具支持。 运行时不需要工具包,因此依赖项标记为
PrivateAssets="All"
。
通过包管理器控制台 (PMC) 或管理 NuGet 包来安装包。
用于安装包的 PMC 选项
在 Visual Studio 中,选择“工具>NuGet 包管理器包管理器>控制台”
从“包管理器控制台”窗口中,运行 以将目录更改为包含
cd GrpcGreeterClient
文件的文件夹GrpcGreeterClient.csproj
。运行以下命令:
Install-Package Grpc.Net.Client Install-Package Google.Protobuf Install-Package Grpc.Tools
管理 NuGet 包选项以安装包
- 右键单击 解决方案资源管理器>中的项目“管理 NuGet 包”。
- 选择“浏览”选项卡。
- 在搜索框中输入 Grpc.Net.Client 。
- 从“浏览”选项卡中选择 Grpc.Net.Client 包,然后选择“安装”。
- 对
Google.Protobuf
和Grpc.Tools
重复这些步骤。
Add greet.proto
在 gRPC 客户端项目中创建 Protos 文件夹。
将 Protos\greet.proto 文件从 gRPC Greeter 服务复制到 gRPC 客户端项目中的 Protos 文件夹。
将
greet.proto
文件中的命名空间更新为项目的命名空间:option csharp_namespace = "GrpcGreeterClient";
编辑
GrpcGreeterClient.csproj
项目文件:右键单击项目,并选择“编辑项目文件”。
添加包含
<Protobuf>
引用 greet.proto 文件的元素的项组:<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>
创建 Greeter 客户端
- 构建客户端项目,以在
GrpcGreeterClient
命名空间中创建类型。
Note
GrpcGreeterClient
类型是由生成进程自动生成的。 工具包 Grpc.Tools 基于 greet.proto 文件生成以下文件:
-
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs
:用于填充、序列化和检索请求和响应消息类型的协议缓冲区代码。 -
GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs
:包含生成的客户端类。
有关 Grpc.Tools 自动生成的 C# 资产的详细信息,请参阅 包含 C# 的 gRPC 服务:生成的 C# 资产。
使用以下代码更新 gRPC 客户端 Program.cs
文件:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Grpc.Net.Client;
namespace GrpcGreeterClient
{
class Program
{
static async Task Main(string[] args)
{
// The port number(5001) must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
Program.cs
包含 gRPC 客户端的入口点和逻辑。
通过以下方式创建 Greeter 客户端:
- 实例化
GrpcChannel
,使其包含用于创建到 gRPC 服务的连接的信息。 - 使用
GrpcChannel
构造 Greeter 客户端:
static async Task Main(string[] args)
{
// The port number(5001) must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
Greeter 客户端会调用异步 SayHello
方法。 随即显示 SayHello
调用的结果:
static async Task Main(string[] args)
{
// The port number(5001) must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
使用 gRPC Greeter 服务测试 gRPC 客户端
- 在 Greeter 服务中,按
Ctrl+F5
在不使用调试程序的情况下启动服务器。 - 在
GrpcGreeterClient
项目中,按Ctrl+F5
在不使用调试程序的情况下启动客户端。
客户端向服务发送问候语,其中包含其名称 GreeterClient 的消息。 该服务会发送“Hello GreeterClient”消息作为答复。 “Hello GreeterClient”答复将在命令提示符中显示:
Greeting: Hello GreeterClient
Press any key to exit...
gRPC 服务在写入命令提示符的日志中记录成功调用的详细信息:
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:5001
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:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/2 POST https://localhost:5001/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished in 78.32260000000001ms 200 application/grpc
Note
本文中的代码需要 ASP.NET Core HTTPS 开发证书来保护 gRPC 服务。 如果 .NET gRPC 客户端失败并显示消息 The remote certificate is invalid according to the validation procedure.
或 The SSL connection could not be established.
,则开发证书不受信任。 要解决此问题,请参阅使用不受信任/无效的证书调用 gRPC 服务。