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

这篇具有很好参考价值的文章主要介绍了.net7 通过 JsonTranscoding 实现 gRPC 与 Web API 一鱼两吃。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目标

    在一个网站内,用一套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的其他包,下面是我的文件夹结构:

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

    在我自己定义的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.

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

 运行

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

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

后记:http 和 gRPC同时提供

    我之前测试时都只单独试了gRPC或Web API,今天把他俩放到一块时发现gRPC 不能调用了,查了官方文档有这么一句话:

Insecure gRPC services must be hosted on a HTTP/2-only port. For more information, see ASP.NET Core protocol negotiation.

    而jsontranscoding 项目中,appsettings里面的配置是 Http1AndHttp2。

{
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http1AndHttp2"
    }
  }
}

    因此,要同时用就得监听2个http端口,一个http1给web api,一个http2 给gRPC,不知道appsettings.json里面如何写,我是代码实现的:文章来源地址https://www.toymoban.com/news/detail-434580.html

webBuilder.UseStartup<Startup>();
webBuilder.UseKestrel(opts =>
{                        
	opts.ListenAnyIP(5004);
	opts.ListenAnyIP(5104, opts => opts.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2);
});

到了这里,关于.net7 通过 JsonTranscoding 实现 gRPC 与 Web API 一鱼两吃的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在.NET7中使用MQTTnet简单实现MQTT通信

    一、MQTT简介 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,主要用于物联网设备间的通信。MQTT协议采用客户端/服务器架构,支持发布/订阅模式和点对点模式,具有高效、可靠、灵活等优点。 MQTT协议主要由三个要素构成:发布者(publisher)、代理服务器(

    2023年04月10日
    浏览(36)
  • 【.Net动态Web API】背景与实现原理

    🚀前言 本文是《.Net Core进阶编程课程》教程专栏的导航站(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:通过源码实例来讲解Asp.Net Core进阶知识点,让大家完全掌握每一个知识点。 专栏适用于人群:Web后端开发人员 ————————————————

    2024年04月22日
    浏览(35)
  • ASP.NET Core Web API 流式返回,实现ChatGPT逐字显示

    🏆作者:科技、互联网行业优质创作者 🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 🏆欢迎关注我(Net数字智慧化基地),里面有很多 高价值 技术文章, 是你刻苦努力也积累不到的经验 ,能助你快速成长。升职

    2024年02月22日
    浏览(62)
  • ASP.NET Core 的 Web Api 实现限流 中间件

    Microsoft.AspNetCore.RateLimiting  中间件提供速率限制(限流)中间件。 它是.NET 7 以上版本才支持的中间件,刚看了一下,确实挺好用,下面给大家简单介绍一下: RateLimiterOptionsExtensions 类提供下列用于限制速率的扩展方法:​​​​​ 固定窗口限制器 滑动窗口限制器 令牌桶限

    2024年01月17日
    浏览(39)
  • ASP.Net Core Web Api+EFCore+MySql实现动态查询(保姆教学)

    本文会详细讲解如何从打开文件到第一个API开发完成,过程十分详细,是基于学习入门。 现在让我们开始吧! 打开VS(演示用的Visual Studio2022) 第一步我们选择创建新项目   第二步 选择开发语言以及应用程序 我们选择C# -所有平台-Web API.找到 ASP.NET Core Web API 应用   这里应用

    2024年02月12日
    浏览(43)
  • ASP.NET Core Web API下基于Keycloak的多租户用户授权的实现

    在上文《Keycloak中授权的实现》中,以一个实际案例介绍了Keycloak中用户授权的设置方法。现在回顾一下这个案例: 服务供应商(Service Provider)发布/WeatherForecast API供外部访问 在企业应用(Client)里有三个用户:super,daxnet,nobody 在企业应用里有两个用户组:administrators,u

    2024年04月22日
    浏览(55)
  • chrom扩展开发配合百度图像文字识别实现自动登录(后端.net core web api)

    好久没做浏览器插件开发了,因为公司堡垒机,每次登录都要输入账号密码和验证码。太浪费时间了,就想着做一个右键菜单形式的扩展。 实现思路也很简单,在这里做下记录,方便下次开发参考。 manifest.json 也叫清单文件。 先简单看下配置: 上述配置基本包含了插件开发

    2024年02月11日
    浏览(47)
  • .Net6 .Net7 支持的 Windows 版本

    .NET 6 支持下列 Windows 版本: (OS) Version 体系结构 Windows 11 21H2 x64、Arm64 Windows 10 客户端 1607+ x64、x86、Arm64 Windows 客户端 7 SP1+、8.1 x64、x86 Windows Server 2012+ x64、x86 Windows Server 核心 2012+ x64、x86 Nano Server 1809+ X64 如果要在以下 Windows 版本上安装 .NET SDK 或运行时,则需要其他依赖项:

    2024年02月16日
    浏览(36)
  • .NET7的AOT的使用

    其实,规划这篇文章有一段时间了,但是比较懒,所以一直拖着没写。 最近时总更新太快了,太卷了,所以借着 .NET 7 正式版发布,熬夜写完这篇文章,希望能够追上时总的一点距离。 本文主要介绍如何在 .NET 和 Go 语言中如何生成系统(Windows)动态链接库,又如何从代码中引

    2024年02月04日
    浏览(39)
  • Debian12安装.NET7 SDK

    Debian,作为最受欢迎的 Linux 发行版之一,于 2023 年 6 月 10 日正式发布了其最新版本 Debian 12,代号“Bookworm”。Debian 12 带来了许多新特性和改进,其中最引人注目的是 Linux 内核的升级,从之前的 5.10 LTS 升级到了 6.1。 这两天尝试了一下Debian12。准备配置一个开发环境,将各类

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包