.net7 通过 JsonTranscoding 实现 gRPC 与 Web API 一鱼两吃

2023-05-16

目标

    在一个网站内,用一套proto即提供gPRC 调用,又提供 Web API 调用。

实现方法

    根据微软官方James Newton King(Newtonsoft.json 作者)的文章,.net7 里面提供了 JsonTranscoding 特性,只需要三步(翻译自链接中的文档):

  1. 第一步用vs2022创建一个 .net7的 gRPC service Create a gRPC client and service
  2. 第二步,添加nuget包 Microsoft.AspNetCore.Grpc.JsonTranscoding。在服务的 startup.cs 文件里添加一句 services.AddGrpc().AddJsonTranscoding();
  3. 最后在 proto 文件里面加上 import "google/api/annotations.proto"; 要求将 annotations.proto 和 http.proto 两个文件下载放到你的proto文件所在文件夹下的 google/api 子文件夹中。

    另外,可以观看我翻译配音的 James Newton King 的专题讲座.NET Conf 2022: .NET7 gRPC 性能提升同时兼具Web API。

上手比划

    主要是找不到 google/api 文件夹编译报错,确保在自己proto文件相同的文件夹下就行了,不用额外安装google的其他包,下面是我的文件夹结构:

    在我自己定义的schedulerpc.proto文件中,加上了 import "google/api/annotations.proto";

syntax = "proto3";

import "common.proto";
import "google/protobuf/wrappers.proto";
import "google/api/annotations.proto";

option csharp_namespace = "Easy.Flownet.Services";

service ScheduleRPC {
  rpc GetVariables (RequestName) returns (VariableInfoList){
	option(google.api.http)={
	  get:"/schedule/{name}"
	};
  }
}

     在gRPC服务里面进行了方法实现:

    public class ScheduleService : ScheduleRPC.ScheduleRPCBase
    {
        public ScheduleService() : base()
        {
        }

        public override Task<VariableInfoList> GetVariables(RequestName request, ServerCallContext context)
        {
            //实现代码
        }
    }

      在startup.cs(或program.cs)中加上了

services.AddGrpc().AddJsonTranscoding();

     并注册了ScheduleService 服务

endpoints.MapGrpcService<ScheduleService>();

添加 Swagger

     跟着.NET Conf 2022: .NET7 gRPC 性能提升同时兼具Web API一步一步操作,首先在服务所在工程文件中添加两个包

	<PackageReference Include="Microsoft.AspNetCore.Grpc.JsonTranscoding" Version="7.0.0" />
	<PackageReference Include="Microsoft.AspNetCore.Grpc.Swagger" Version="0.3.0" />

    然后在startup.cs 或 program.cs 中添加代码

services.AddGrpcReflection();
services.AddGrpcSwagger();
services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title="My API", Version="v1"});
});

...

app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});

...

endpoints.MapGrpcReflectionService();

     That's all you need.

 运行

    启动gRPC服务后,在浏览器中键入我在schedulerpc.proto文件中给GetVariables指定的url地址,http://localhost:5002/schedule/{name} 正确返回了json。

    然后我立刻删除了单独创建的web api项目,也不用再为gRPC与web api之间的互操作烦恼了,因为都在一个项目里,是不是很爽啊?!感谢James Newton King!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net7 通过 JsonTranscoding 实现 gRPC 与 Web API 一鱼两吃 的相关文章

  • 缺少节点-v59-linux-x64/grpc_node.node

    我正在尝试在我的服务器中使用 Firebase admin SDK 当我部署时 出现错误 我在 firebase admin node module 映射中缺少文件 node v59 linux x64 grpc node node 我在包
  • 尝试使用 php 发送 POST 请求,无论我做什么,我都会收到“HTTP ERROR 500”

    为了发出 HTTP 请求 有人建议我尝试使用 PHP 并给了我一段代码 url https example com dashboard api data array to gt PHONE NUMBER from gt SENDER ID
  • 有没有办法以编程方式访问 Google 的搜索引擎结果? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 谷歌是否提供了一种以编程方式查看特定查询的搜索引擎结果的方法 我想构建一个跟踪应用程序 以便用户可以看
  • 如何从文件系统访问 api window.showDirectoryPicker() 获取选定的目录路径

    当我选择一个文件夹时 我确实得到了 dirHandle 但无法弄清楚什么属性或方法将为我提供完整路径 const dirHandle await window showDirectoryPicker 所以类似 let path dirHan
  • musicbrainz api 获取所有发行组和发行日期

    如何使用 musicbrainz api 在一次调用中获取艺术家的所有发行组和发行日期 我最接近做到这一点的是使用 http musicbrainz org ws 2 release group query arid 494e8d09 f8
  • VBA - 如何从网站下载.xls并将数据放入Excel文件

    我设法使用 VBA 达到准备从网络下载 Excel 文件的程度 但我无法弄清楚如何实际下载该文件并将其内容放入我正在使用的 Excel 文件中 有什么建议么 谢谢 这是到目前为止的代码 Sub GetData Dim IE As Inter
  • 如何使用授权 API 设置部分身份验证

    好的 我正在通过 Authorize net API 设置部分付款 以便能够使用多张卡支付单笔余额 费用 我假设他们的部分身份验证功能涵盖了我的用例 但在测试中 我可以在此处使用 API 实时控制台向您展示一个问题 https develo
  • React + Redux 和 REST API?

    我在 Node 中构建了一个简单的 CRUD 应用程序 并已在 Express 中完成了其余 API 的创建 我现在正在寻求添加前端功能 并希望使用 React Redux 作为学习练习 然而 似乎所有围绕此的教程都直接使用 Redux 访
  • API 调用时出现 UnicodeEncodeError (json)

    我正在尝试打印此 API 调用的结果 但收到 UnicodeEncodeError 可能是超级菜鸟问题 但非常感谢任何帮助 import http client import json api key hidden connection h
  • RESt api:根据身份验证对资源和内容进行识别

    我正在设计一个遵循 HATEOAS REST 原则的 API 但我不确定这个基本点 资源识别 假设这个网址 images它公开了用户 向该用户 上传的所有图像 假设我使用 oauth 访问令牌进行身份验证 images 的内容将根据授权标头
  • 在 Java 中处理视频(DVD、.avi .mkv)

    在寻找了一个像样的 Java 视频播放库之后 我发现了问题 周围的每个人都在尖叫不要使用 JMF 因为它已经过时 过时并且需要用户安装它 其他替代方案 例如 VLCJ 如果可以工作的话似乎不错 但仍然相对不稳定并且依赖大量本机代码 并且至于
  • CSS3 与 JavaScript

    所以我试图在网页上创建一个动画 并试图找到一种使用 CSS3 来实现它的方法 但我对如何做到这一点感到非常困惑 我需要发生的是 当用户单击链接元素时 我希望 div 展开并填充特定于所单击的链接元素的内容 例如 当用户单击标题为 About
  • 我可以通过什么方式混合 jQuery 和 vanilla JavaScript

    我有一个用普通 JavaScript 编写的 Web 应用程序 我想用 jQuery 动画来增强它 并使用我在各种 jQuery 插件中找到的一些功能 例如上传 http www uploadify com 可以通过什么方式将 jQuery
  • 你可以拥有你的 API 并在 Laravel 中使用它吗?

    我制作了一个在 Laravel 中返 回 json 的 API 路线 api php 现在我想在我的内部使用所述APIweb项目的一侧 路线 web php 包括中间件 刀片视图 etc 我当前的解决方案是这样的 public functi
  • 使用 Swagger 的 Spring REST API 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以帮助我生成 RESTful API 文档的工具 我的服务器是用Java编写的并使用S
  • RESTful API:我应该在哪里编码我的工作流程?

    我正在开发一个 RESTful API 这是我的第一个 API 也是我的第一个真正大型的编码项目 因此 我仍在学习很多关于建筑等方面的知识 目前 我的 api 设置分为以下几层 HTTP层 资源层 领域模型 业务逻辑层 数据访问 存储层 持
  • 如何通过Grape API获取路由

    我使用 gem grape 作为 api 我尝试通过命令获取 api urlrake grape routes namespace grape do desc routes task routes gt environment do API
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • 如何在 Cakephp 3 中创建按字段集分组的多个复选框

    我在阅读本文档时遇到问题 Cakephp3 Cookbook 表单 创建选择选择器 http book cakephp org 3 0 en views helpers form html creating select pickers我尝
  • 我想将我的 NEXT.js 项目链接到静态网站

    我有一个使用 HTML CSS 开发的网站 它是一个静态网站 但现在我使用 NEXT js 与 Strapi API 集成创建了一个博客项目 我的问题是如何将我的静态网站与我的 Next js 项目链接起来 我尝试使用链接标签 但没有用 i

随机推荐

  • 5G WiFi 安信可 BW16 模组 RTL8720DN 入门笔记 2:Linux 搭建二次开发SDK开发环境,点亮一盏LED灯。

    首先按照环境所依赖的包 xff1a sudo apt span class token operator span get install git wget libc6 span class token operator span i386
  • 2022年度总结:拒绝无效努力,实现破圈成长。

    在从毕业一直到现在 xff0c 每年年底我都会写一篇关于自己的从技术 商业 人情世故以及未来展望的博文 xff0c 以至于归纳每个时期的自己 xff0c 这是一个特别好的时代 xff0c 互联网的高速发展 xff0c 让信息连结变的更加方便
  • webpack与babel

    一 Bebal 1 Bebal是什么 访问bebel官网 xff08 https babeljs io xff09 xff0c 首页的介绍如下图所示 xff1a Babel是JavaScript编译器 现今 xff0c xff08 有了它
  • MFC消息处理[转]

    PreTranslateMessage作用和使用方法 PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的 xff0c 绝大多数本窗口的消息都要通过这里 xff0c 比较常用 xff0c 当需要
  • Shell函数(函数定义、函数变量、函数调用、函数传参、函数返回值、获取函数返回值)

    分享知识 传递快乐 1 函数定义 linux shell 可以用户定义函数 xff0c 然后在shell脚本中可以随便调用 Shell 函数定义的语法格式如下 xff1a function funname 函数体 return int 格式
  • 产生死锁的必要条件

    死锁 指两个或两个以上的进程在执行过程中 xff0c 因争夺资源而造成的一种互相等待的现象 xff0c 若无外力作用 xff0c 它们都将无法推进下去 此时称系统处于死锁状态或系统产生了死锁 xff0c 这些永远在互相等竺的进程称为死锁进程
  • Proxifier设置代理上网详细操作

    分享知识 传递快乐 Proxifier配置上网代理 Proxifier 是一款功能非常强大的socks5客户端 xff0c 可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链 支持Xp xff0c Vista
  • NVIDIA Jetson系列刷机篇(2)之快速恢复

    在填坑NVIDIA Jetson系列开发版时难免有对系统环境造成严重污染的情况 xff0c 这时就要重新刷机了 拿起Jetson4下载刷机镜像解压等等 xff0c 安装依赖漫长的操作耗费一天就过去了 下面接上篇在刷完NVIDIA的主机器 u
  • 暴力推导 Beta 函数与 Gamma 函数关系式

    B x y 61 x y x 43 y 其中 x 61 43 0 e t t x 1 d t B x y 61 1 0 t x 1 1 t y 1 d t
  • 用PyQt5写了个音乐播放器

    首先先展示一下界面 xff08 不美观但好用 xff09 除了不能看歌词功能该有的都有 xff0c 作为本地播放器还挺好用的 xff0c 界面是用PyQt5做的 下面是源代码 xff1a span class token keyword i
  • STM32F4无人机动力旋翼拉力测试

    更多交流欢迎关注作者抖音号 xff1a 81849645041 目的 了解无人机电调 电机转速 旋翼拉力与油门给定信号之间的关系 xff0c 可以通过相关设备进行拉力测试 实验原理 飞机旋翼绕旋翼旋转轴旋转时 xff0c 每个叶片的工作类同
  • STM32F4无人机6轴运动处理组件MPU6050

    目的 学习MPU6050的原理 MPU6050初始化方法 原理 MPU6050是9轴运动处理传感器 它集成了3轴MEMS陀螺仪 xff0c 3轴MEMS加速度计 xff0c 以及一个可扩展的数字运动处理器DMP xff08 Digital
  • 基于STM32F030驱动BMP180气压传感器

    目的 了解气压传感器 BMP180 的驱动原理 xff0c 通过配置 STM32F030 的GPIO及 IIC通信时序 xff0c 采集气压传感器 BMP180的值 原理 在测量海拔高度时 xff0c 传统的做法是通过测量某一高度的大气压力
  • 10G大文件上传最全方案:秒传、断点续传、分片上传,包教会!

    上一篇 xff1a 麻了 xff01 Fastjson 再曝反序列化漏洞 前言 文件上传是一个老生常谈的话题了 xff0c 在文件相对比较小的情况下 xff0c 可以直接把文件转化为字节流上传到服务器 xff0c 但在文件比较大的情况下 x
  • vscode运行C/C++程序

    一 vsocde对C C 43 43 的支持 Visual Studio Code对C C 43 43 语言的支持由Microsoft C C 43 43 扩展程序提供 它使得C C 43 43 在Windows Linux和macOS等跨
  • KEIL下载键变灰色,ST-link无法下载程序

    昨天在调试板子时 xff0c ST LINK下载还是好好的 xff0c 今天开始调试程序 xff0c 突然发现 xff0c KEIL的下载键变成了灰色 xff0c 无法下载 xff0c 如下 xff1a 后面仔细核对了KEIL的设置 xff
  • C++编程中常遇到的问题

    1 路径中不能存在空格 2 for等循环结构中 xff0c 如果判断条件的变量是size t或者unsigned时 xff0c 最好不要采用 i 来递减变量 xff0c 因为这两种类型没有负数 3 引用的引用不可用 xff1a int am
  • keil 采用 makefile 实现编译

    1 说明 由于keil 软件需要收费 xff0c 故有许多公司或者个人希望能够使用makefile 实现编译功能 如此一来 xff0c 就可以脱离了keil 公司的限制 xff0c 自由开发 2 开发环境 xff08 1 xff09 win
  • ROS常用消息

    1 sensor msgs sensor msgs是存储传感器常用消息数据message的包 xff0c 提供各种消息数据message的转换方法并定义了常用传感器使用的消息类型message xff0c 如相机 激光扫描测距仪等 xff1
  • .net7 通过 JsonTranscoding 实现 gRPC 与 Web API 一鱼两吃

    目标 在一个网站内 xff0c 用一套proto即提供gPRC 调用 xff0c 又提供 Web API 调用 实现方法 根据微软官方James Newton King xff08 Newtonsoft json 作者 xff09 的文章