使用 C# 的 gRPC 服务

news/发布时间2024/5/16 20:36:40

本文内容

  1. proto 文件
  2. 将 .proto 文件添加到 C# 应用
  3. 对 .proto 文件的 C# 工具支持
  4. 生成的 C# 资产
  5. 其他资源

本文档概述在 C# 中编写 gRPC 应用所需的概念。 此处涵盖的主题适用于基于 C-core 和基于 ASP.NET Core 的 gRPC 应用。

proto 文件

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

  • gRPC 服务的定义。
  • 在客户端与服务器之间发送的消息。

有关 protobuf 文件的语法的详细信息,请参阅为 .NET 应用创建 Protobuf 消息。

例如,请考虑开始使用 gRPC 服务中使用的 greet.proto 文件:

  • 定义 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;
}

若要查看翻译为非英语语言的代码注释,请在 此 GitHub 讨论问题中告诉我们。

将 .proto 文件添加到 C# 应用

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

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

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

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

对 .proto 文件的 C# 工具支持

需要工具包 Grpc.Tools 才能从 .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.52.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/17225838.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

单元测试必备:Asp.Net Core代码覆盖率实战,打造可靠应用 !

引言 在前几章我们深度讲解了单元测试和集成测试的基础知识,这一章我们来讲解一下代码覆盖率,代码覆盖率是单元测试运行的度量值,覆盖率通常以百分比表示,用于衡量代码被测试覆盖的程度,帮助开发人员评估测试用例的质量和代码的健壮性。常见的覆盖率包括语句覆盖率(Line Co…

读天才与算法:人脑与AI的数学思维笔记07_数字绘画

数字绘画1. 数字绘画 1.1. 事物的可预测性与不可预测性构成了我们熟识的世界 1.1.1. 汤姆斯托帕德(Tom Stoppard) 1.2. 艺术作品就是通过各种形式给人带来美的感受,从而使人们获得精神上的愉悦与放松 1.3. “像素化”的画作激发了人…

不如你把我杀了吧 | 绘制自定义的 3D 地图

如何根据自己的json数据绘制类似这种地图,仅供参考 1、准备数据。 因为自定义,所以全部的数据都来源自己。我们需要准备地图数据(包括但不限于地图轮廓数据,点数据) 这里我的数据使用的是arcgis导出json数据,因此数据格式足够规范,这省去了很多的麻烦。 2、导入相关库、…

任务栏“居中”显示!这个美观又实用的小技巧

有网友表示,电脑任务栏的软件图标都是靠左显示的,不太美观,有木有办法让它们“居中”呢?其实是可以的,今天我就教大家如何设置,快来学一招吧! 1、首先,新建一个文件夹,名字/位置随意;2、右键点任务栏,选择【工具栏】-【新建工具栏】,选择刚才建的文件夹; 3、接着…

SRPCore ColorPyramid优化

很早之前就看HDRP里面的Color ColorPyramid的生成不爽了,都不知道为什么明明有现成的ColorPyramid.compute放着不用,还是用的是PixelShader生成。DrawCall数量多,效率也不够Compute的方式快。 这篇文章主要解析ColorPyramid.compute怎么用LDS优化GuassianBlur以及不同方式Co…

删除顺序表L中下标为p的元素

数据结构 顺序表 笔试题2:删除顺序表L中下标为p(0<p<length-1)的元素,成功返回1,否则返回0,并将被删除元素的值赋给e/*************************************************************************************** file name: 1.c* author : lu.ciana.598393@gm…