记angular和asp.net使用grpc进行通信
AspNetCore配置grpc服务端
新建一个Demo项目: GrpcStartup, 目录结构如下图:

GrpcStartup.GrpcServices需要安装下面的依赖
<PackageReference Include="Google.Protobuf" Version="3.14.0" />
<PackageReference Include="Grpc.AspNetCore" Version="2.34.0" />
<PackageReference Include="Grpc.AspNetCore.Web" Version="2.34.0" />
<PackageReference Include="Grpc.Net.Client" Version="2.34.0" />
<PackageReference Include="Grpc.Tools" Version="2.34.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
编写protobuf
DotnetVersionReply.proto
syntax = "proto3";
import "google/protobuf/any.proto";
option csharp_namespace = "GrpcStartup.GrpcServices";
message DotnetVersionReply {
string version = 1;
string environment = 2;
}
Greeter.proto
syntax = "proto3";
import "google/protobuf/any.proto";
import "Protos/DotnetVersionReply.proto";
service Greeter {
rpc GetDotnetEnvironment(google.protobuf.Any) returns (DotnetVersionReply);
}
protobuf写好后, 需要再.csproj中引入对应的文件
<ItemGroup>
<Protobuf Include=".\Protos\*.proto" GrpcServices="server" />
</ItemGroup>
接下来build项目, 会生成相关代码, 这个例子中会有个一个 Greeter.GreeterBase 的抽象类被生成, 我们需要继承它编写我们的业务代码
GreeterRpcService.cs
public class GreeterRpcService: Greeter.GreeterBase
{
public override Task<DotnetVersionReply> GetDotnetEnvironment(Any request, ServerCallContext context)
{
string os = Environment.OSVersion.VersionString;
string dotnetVersion = Environment.Version.ToString();
return Task.FromResult(new DotnetVersionReply
{
Environment = os,
Version = dotnetVersion
});
}
}
修改Startup类, 配置Grpc
Startup.ConfigureServices
services.AddGrpc();
// 允许grpc-web
services.AddCors(o => o.AddPolicy("AllowGrpc", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding");
}));
Startup.Configure
app.UseRouting();
app.UseGrpcWeb(new GrpcWebOptions
{
// 允许grpc-web
DefaultEnabled = true
});
// 允许grpc-web
app.UseCors();
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<GreeterRpcService>()
.RequireCors("AllowGrpc");
endpoints.MapRazorPages();
});
使用grpcui测试服务
grpcui是一个命令行工具, 运行它会打开一个网页, 下载链接
项目中支持grpcui需要配置一下
安装依赖: Grpc.AspNetCore.Server.Reflection
配置服务: services.AddGrpcReflection();
运行grpcui: C:\Users\laggage\Desktop\apps\grpcui_1.1.0_windows_x86_64> .\grpcui.exe localhost:5001

配置angular客户端
生成angular项目(略);
从protobuf文件生成js客户端代码
使用protoc命令生成typescript版本的客户端代码, 生成代码前, 需要先下载后 protoc.exe 和 protoc-gen-grpc-web 并将他们添加到环境变量下, 添加好后重启一下电脑让环境变量生效
C:\Users\laggage\Documents\coding\projects\GrpcStartup> protoc.exe -I. .\Greeter.proto --grpc-web_out=import_style=commonjs,mode=grpcwebtext:. --proto_path .
这个命令会生成3个文件

客户端代码
接下来编写客户端代码即可, 编写前需要先安装npm包
google-protobufgrpc-web
然后写一个angular服务, 调用protobuf中定义的方法
greeter.service.ts
import { Injectable } from '@angular/core';
import { GreeterClient } from './GreeterServiceClientPb';
import { HelloRequest, DotnetVersionReplay } from './Greeter_pb';
import * as google_protobuf_any_pb from 'google-protobuf/google/protobuf/any_pb';
@Injectable({
providedIn: 'root'
})
export class GreeterService {
static greeterService = new GreeterClient('https://localhost:5001');
constructor() {
}
getDotnetVersion() {
GreeterService.greeterService.getDotnetEnvironment(new google_protobuf_any_pb.Any(), {}, (err, res: DotnetVersionReplay) => {
const version = res.getVersion();
const env = res.getEnvironment();
console.log(err, res);
console.log(`env: ${env}, version: ${version}`);
});
}
}
在AppComponent中注入这个服务并调用getDotnetVersion, 可以在浏览器控制台看到结果

记angular和asp.net使用grpc进行通信的更多相关文章
- 记Angular与Django REST框架的一次合作(2):前端组件化——Angular
注:这是这个系列的第二部分,主要集中在Angular的使用方面.之前使用过AngularJS(Angular 1.x),混在Django的模板中使用,这些页面一般完全是结果展示页.在有Django表单 ...
- User Authentication with Angular and ASP.NET Core
User authentication is a fundamental part of any meaningful application. Unfortunately, implementing ...
- 记一次ASP.NET MVC4 升级到MVC5的小问题解决
原文:记一次ASP.NET MVC4 升级到MVC5的小问题解决 .NET 4.0 MVC4版本,升级到.NET 4.6.1 MVC5: 1.使用nuget更新所有 与mvc相关的类库; 2.更改~/ ...
- ASP.NET Core gRPC 入门全家桶
一. 说明 本全家桶现在只包含了入门级别的资料,实战资料更新中. 二.官方文档 gRPC in Asp.Net Core :官方文档 gRPC 官网:点我跳转 三.入门全家桶 正片: ASP.NET ...
- ASP.NET Core gRPC 健康检查的实现方式
一. 前言 gRPC 服务实现健康检查有两种方式,前面在此文 ASP.NET Core gRPC 使用 Consul 服务注册发现 中有提到过,这里归纳整理一下.gRPC 的健康检查,官方是定义了标准 ...
- docker部署angular和asp.net core组成的前后端分离项目
最近使用docker对项目进行了改进,把步骤记录一下,顺便说明一下项目的结构. 项目是前后端分离的项目,后端使用asp.net core 2.2,采用ddd+cqrs架构的分层思想,前端使用的是ang ...
- 旧 WCF 项目迁移到 asp.net core + gRPC 的尝试
一个月前,公司的运行WCF的windows服务器down掉了,由于 AWS 没有通知,没有能第一时间发现问题. 所以,客户提出将WCF服务由C#改为JAVA,在Linux上面运行:一方面,AWS对Li ...
- ASP.NET Core GRPC 和 Dubbo 互通
一.前言 Dubbo 是比较流行的服务治理框架,国内不少大厂都在使用.以前的 Dubbo 使用的是私有协议,采集用的 hessian 序列化,对于多语言生态来说是极度的不友好.现在 Dubbo 发布了 ...
- .Net Core Grpc 实现通信
.Net Core 3.0已经把Grpc作为一个默认的模板引入,所以我认为每一个.Net程序员都有学习Grpc的必要,当然这不是必须的. 我在我的前一篇文章中介绍并创建了一个.Net Core 3.0 ...
随机推荐
- jquery-from+php 文件上传
闲话不多说上代码 前端代码 <!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charse ...
- ping 路由跟踪
pathping: pathping ip地址/网址 C:\Users\Administrator>pathping 119.29.18.11 通过最多 30 个跃点跟踪到 119.29.18. ...
- Tensorflow--------tf.nn库
1.tf.nn :提供神经网络相关操作,包括卷积神经(conv),池化操作(pooling),归一化,loss,分类操作,embedding,RNN,Evaluation. 2.tf.layers:高 ...
- WEB安全讨论-表单登录是先验证验证码还是密码
表单登录是先验证验证码还是密码? 肯定是验证码呀!!!这是毋庸置疑的.但是发现有人会验证密码,感觉先验证密码和先验证验证码是一个概念是一样的.但是其实是完全不一样的.下面我们来一起详细的剖析一下: 消 ...
- ios iphone 崩溃字符记录
如题,近日iphone被爆出有一串字符可引发系统错误 (بٍٍٍٍََُُُِّّّْرٍٍٍٍََُُِِّّّْآٍٍٍَُّ بٍٍٍٍََُُُِّّّْرٍٍٍٍََُُِِّّّْآٍٍٍ ...
- Lock锁 精讲
1.为什么需要Lock 为什么synchronized不够用,还需要Lock Lock和synchronized这两个最常见的锁都可以达到线程安全的目的,但是功能上有很大不同. Lock并不是用来代替 ...
- JavaScript 获取当天0点以及当前时间方法
js 取得今天0点: const start = new Date(new Date(new Date().toLocaleDateString()).getTime()); console.log( ...
- Promethues 之 Thanos
Promethues简介和原理 请看我之前写的 Prometheus简介,原理和安装 https://www.cnblogs.com/you-men/p/12839535.html 官方架构问题 官方 ...
- 【Git】4、创建代码仓库,HTTP、SSH拉取远端代码
拉取远端代码:使用Git命令下载远程仓库到本地 文章目录 拉取远端代码:使用Git命令下载远程仓库到本地 1.创建远程代码仓库 2.创建仓库 3.进入仓库 4.HTTP(S)获取远程仓库 首次拉取 更 ...
- ctfhub技能树—文件上传—00截断
什么是00截断 相关教程:http://www.admintony.com/%E5%85%B3%E4%BA%8E%E4%B8%8A%E4%BC%A0%E4%B8%AD%E7%9A%8400%E6%88 ...