首页 > 编程语言 >使用 C# 的 gRPC 服务

使用 C# 的 gRPC 服务

时间:2024-04-23 09:01:51浏览次数:28  
标签:文件 服务 proto C# 生成 gRPC 客户端

本文内容

  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

标签:文件,服务,proto,C#,生成,gRPC,客户端
From: https://www.cnblogs.com/siyunianhua/p/18152027

相关文章

  • 使用GitHub Actions和GitHub pages实现前端项目的自动打包部署
    1.引言Asweallknow,前端部署项目是比较简单的,通常情况下只需要将打包的产物(index.html、.js文件、.css文件等)放在Web服务器下就......
  • 如何使用 Apifox 请求 gRPC 接口?
    使用Apifox发送gRPC接口Apifox支持基于.proto文件的gRPC调试,包括一元调用和流式调用。在创建项目时「选择gRPC项目」-->「导入.proto文件」,无需写代码即可直接调用gRPC接口。  创建gRPC在调试gRPC接口之前,也需要先导入作为API定义的.proto文件。如果......
  • R语言用GARCH模型波动率建模和预测、回测风险价值 (VaR)分析股市收益率时间序列|附代
    原文链接:http://tecdat.cn/?p=26897最近我们被客户要求撰写关于GARCH的研究报告,包括一些图形和统计输出。风险价值(VaR)是金融风险管理中使用最广泛的市场风险度量,也被投资组合经理等从业者用来解释未来市场风险风险价值(VaR)VaR可以定义为资产在给定时间段内以概率θ......
  • Numerical Results of R-Hybas CG method and R-HFRas CG method
    ......
  • Reflective journay
    First,thetextissimpie,whatishoulddoarememorizingsomemoreadvancedvocabularyandusingtheCOCAtocorrectyourgrammaticalerrorsandlearningauthenticlanguageSecondly,ishouldapplymoreDMCskillstocultivatemycontent,applyingmorep......
  • stm32串口晶振不对输出乱码+汇承HC-14lora模块
    最近要用到一个lora无线透传模块,然后就先用两个32开发板(用的STM32F103C8T6)试试简单的收发数据。结果,第一步串口发送一句话就寄了,我串口打印了“hi”,结果出现了一堆乱码,我寻思着,就这一句代码也不至于还能错吧。。。然后我以为是USB-TTL的问题,换了一个能用的还是一样。。。但是很奇......
  • Spring 源码阅读(二)IoC 容器初始化以及 BeanFactory 创建和 BeanDefinition 加载过程
    相关代码提交记录:https://github.com/linweiwang/spring-framework-5.3.33IoC容器三种启动方式XMLJavaSE:ApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml")ApplicationContextcontext=newFileSystemXmlApplicationContext("C:/beans......
  • 实验3_C语言函数应用编程
    Task11#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#include<windows.h>5#defineN8067voidprint_text(intline,intcol,chartext[]);8voidprint_spaces(intn);9voidprint_blank_lines(intn)......
  • 拥抱 invokedynamic,在 Java agent 中驯服类加载器
    前言在开发项目的agent时,找了很多类隔离加载的解决方案,最终参照开源项目实现,采用了ElasticAPMJavaagent的方案。以下为本方案的核心说明文章。翻译正文ByteBuddy最棒的一点是,它允许您编写Javaagent,而无需手动处理字节代码。agent作者只需用纯Java编写要注入的代码,......
  • ctf 第一天
    通过用户名或者密码进行获取flag需要更改referer和X-Forwarded-For来通过验证通过disearch进行文件的搜索拿到题目,如果没有思路可以先使用工具进行暴力破解看看文件如果发现git的文件可以使用一下方法进行还原python2GitHack.pyhttp://challenge-47f45969ef48a54f.sand......