欢迎光临
我们一直在努力

使用C#的gRPC服务

proto 文件

grpc 使用协定优先方法进行 API 开发。 默认情况下,协议缓冲区 (protobuf) 用作接口定义语言 (IDL)。 .proto 文件包含:

  • gRPC 服务的定义。
  • 客户端与服务器之间发送的消息。
  • 定义 Greeter 服务。
  • Greeter 服务定义 SayHello 调用。
  • SayHello 发送 HelloRequest 消息并接收 HelloReply 消息:
syntax = "proto3"; option csharp_namespace = "GrpcGreeter"; package greet; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply); } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings. message HelloReply { string message = 1; } 

.proto 文件添加到 C# 应用

通过将 .proto 文件添加到 <Protobuf> 项组中,可将该文件包含在项目中:

<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Server" /> </ItemGroup> 

默认情况下,<Protobuf> 引用将生成具体的客户端和服务基类。 可使用引用元素的 GrpcServices 特性来限制 C# 资产生成。 有效 GrpcServices 选项如下:

  • Both(如果不存在,则为默认值)
  • Server
  • Client
  • None

.proto 文件的 C# 工具支持

  • 在每次生成项目时按需生成。
  • 不会添加到项目中或是签入到源代码管理中。
  • 是包含在 obj 目录中的生成工件。

服务器和客户端项目都需要此包。 Grpc.AspNetCore 元包中包含对 Grpc.Tools 的引用。 服务器项目可以使用 Visual Studio 中的包管理器或通过将 <PackageReference> 添加到项目文件来添加 Grpc.AspNetCore

<PackageReference Include="Grpc.AspNetCore" Version="2.28.0" /> 

客户端项目应直接引用 Grpc.Tools 以及使用 gRPC 客户端所需的其他包。 运行时不需要工具包,因此依赖项标记为 PrivateAssets="All"

<PackageReference Include="Google.Protobuf" Version="3.11.4" /> <PackageReference Include="Grpc.Net.Client" Version="2.28.0" /> <PackageReference Include="Grpc.Tools" Version="2.28.1"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> 

生成的 C# 资产

工具包会生成表示在所包含 .proto 文件中定义的消息的 C# 类型。

对于服务器端资产,会生成抽象服务基类型。 基类型包含 .proto 文件中所含的所有 gRPC 调用的定义。 创建一个派生自此基类型并为 gRPC 调用实现逻辑的具体服务实现。 对于 greet.proto(前面所述的示例),会生成一个包含虚拟 SayHello 方法的抽象 GreeterBase 类型。 具体实现 GreeterService 会替代该方法,并实现处理 gRPC 调用的逻辑。

public class GreeterService : Greeter.GreeterBase { private readonly ILogger<GreeterService> _logger; public GreeterService(ILogger<GreeterService> logger) { _logger = logger; } public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { return Task.FromResult(new HelloReply { Message = "Hello " + request.Name }); } } 

对于客户端资产,会生成一个具体客户端类型。 .proto 文件中的 gRPC 调用会转换为具体类型中的方法,可以进行调用。 对于 greet.proto(前面所述的示例),会生成一个 GreeterClient 类型。 调用 GreeterClient.SayHelloAsync 以发起对服务器的 gRPC 调用。

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(); } 

默认情况下,会为 <Protobuf> 项组中包含的每个 .proto 文件都生成服务器和客户端资产。 若要确保服务器项目中仅生成服务器资产,请将 GrpcServices 属性设置为 Server

<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Server" /> </ItemGroup> 

同样,该属性在客户端项目中设置为 Client

其他资源

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《使用C#的gRPC服务》
文章链接:https://www.456zj.com/11427.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址