首页 > 编程语言 >C# 实现 gRPC 服务和调用

C# 实现 gRPC 服务和调用

时间:2024-04-23 09:02:47浏览次数:16  
标签:调用 C# gRPC using message Grpc 服务端 客户端

gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。

主要优点如下:
1.高性能轻量化。
2.协议优先的 API 定义模式,默认使用协议缓冲区,允许与语言无关的实现。
3.可用于多种语言的工具,以生成强类型服务器和客户端。
4.支持客户端、服务器和双向流式处理调用。
5.使用 Protobuf 二进制序列化减少对网络的使用。

gRPC 服务可以托管在 ASP.NET Core 上。 这些服务与日志记录、依赖关系注入 (DI)、身份验证和授权等 ASP.NET Core 功能完全集成。

本文示例包含服务端实现和客户端实现,服务端需要先从NuGet安装以下类库:

Grpc.AspNetCore

Grpc.AspNetCore.Server

Grpc.Tools

 

服务端项目配置如下:

<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Grpc.AspNetCore" Version="2.60.0" />
<PackageReference Include="Grpc.AspNetCore.Server" Version="2.60.0" />
<PackageReference Include="Grpc.Tools" Version="2.60.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
</Project>
greet.proto 配置文件内容如下,服务端和客户端一致。

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;
}
客户端项目配置:

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Grpc.AspNetCore" Version="2.60.0" />
<PackageReference Include="Grpc.Net.Client" Version="2.60.0" />
<PackageReference Include="Grpc.Tools" Version="2.60.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>
</Project>

需要从NuGet安装如下类库:

Grpc.AspNetCore

Grpc.Net.Client

Grpc.Tools

安装 Grpc.Tools 后,在生成项目时,可以自动生成对应的Protobuf通讯类。

 

这里还要把服务端的项目加载配置贴出来一下,主要是关于https的启动配置

 

在这里面

{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:64606",
"sslPort": 44331
}
},
"profiles": {
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7086;http://localhost:5193",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

代码实现
客户端代码
using Grpc.Net.Client;
using GrpcGreeter;
using static GrpcGreeter.Greeter;

using var channel = GrpcChannel.ForAddress("https://localhost:7086", (new GrpcChannelOptions() { UnsafeUseInsecureChannelCallCredentials = true }));
var client = new 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();
服务端代码
using Grpc.Core;
using GrpcGreeter;
using static GrpcGreeter.Greeter;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddGrpc();

var app = builder.Build();

// Configure the HTTP request pipeline.
app.MapGrpcService<GreeterService>();
app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client.");

app.Run();

public class GreeterService : GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
Console.WriteLine($"Request:{request.Name}");
return Task.FromResult(new HelloReply { Message = $"Hello this is rjcql's {request.Name}" });
}
}
调用示例
服务端控制台输出

 

客户端控制台输出

 

项目目录结构示意

 


原文链接:https://blog.csdn.net/rjcql/article/details/135890720

标签:调用,C#,gRPC,using,message,Grpc,服务端,客户端
From: https://www.cnblogs.com/siyunianhua/p/18152022

相关文章

  • Practice
    18.链表只能一个接着一个遍历,不允许通过随机访问7.链表的地址是连续的,通过内部的指针来进行访问//假设该链表只给出了头指针head。在不改变链表的前提下,请设计一个尽可能高效的算法,//查找链表中倒数第k(k为正整数)个位置上的结点。若查找成功,算法输出该结点的data值,并返回......
  • 使用 C# 的 gRPC 服务
    本文内容proto文件将.proto文件添加到C#应用对.proto文件的C#工具支持生成的C#资产其他资源本文档概述在C#中编写 gRPC 应用所需的概念。此处涵盖的主题适用于基于 C-core 和基于ASP.NETCore的gRPC应用。proto文件gRPC使用协定优先方法进行......
  • 使用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)......