C# 使用 grpc 问题汇总

grpc 是个跨平台的远程调用框架,第一次在windows平台使用,有很多问题需要面对,下面做个汇总,以备检查

消息长度设置

出现的问题 1

客户端出现异常

未经处理的异常:  Grpc.Core.RpcException: Status(StatusCode=Internal, Detail="Max message size exceeded")
   在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   在 Grpc.Core.Internal.AsyncCall`2.UnaryCall(TRequest msg)
   在 Grpc.Core.Calls.BlockingUnaryCall[TRequest,TResponse](CallInvocationDetails`2 call, TRequest req)
   在 Grpc.Core.DefaultCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method`2 method, String host, CallOptions options, TRequest request)
   在 Grpc.Core.Internal.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method`2 method, String host, CallOptions options, TRequest request)
   在 Helloworld.Greeter.GreeterClient.GetUsers(SearchUserRequest request, CallOptions options) 位置 E:\MyTest\grpc-1.0.x\examples\csharp\helloworld\Greeter\HelloworldGrpc.cs:行号 148
   在 Helloworld.Greeter.GreeterClient.GetUsers(SearchUserRequest request, Metadata headers, Nullable`1 deadline, CancellationToken cancellationToken) 位置 E:\MyTest\grpc-1.0.x\examples\csharp\helloworld\Greeter\HelloworldGrpc.cs:行号 144
   在 GreeterClient.Program.Main(String[] args) 位置 E:\MyTest\grpc-1.0.x\examples\csharp\helloworld\GreeterClient\Program.cs:行号 61

在服务端出现异常

W1024 09:50:02.749888 Grpc.Core.Server Exception while handling RPC. System.InvalidOperationException: Error sending status from server.
   在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   在 Grpc.Core.Internal.UnaryServerCallHandler`2.<HandleCall>d__0.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
   在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   在 Grpc.Core.Server.<HandleCallAsync>d__11.MoveNext()

## 出现问题 2

在客户端出现异常

未经处理的异常:  Grpc.Core.RpcException: Status(StatusCode=Internal, Detail="{"created":"@1477274209.883000000","description":"RST_STREAM","file":"c:\jenkins\workspace\gRPC_build_artifacts\architecture\x86\language\csharp\platform\windows\vsprojects\..\src\core\ext\transport\chttp2\transport\frame_rst_stream.c","file_line":107,"http2_error":2}")
   在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   在 Grpc.Core.Internal.AsyncCall`2.UnaryCall(TRequest msg)
   在 Grpc.Core.Calls.BlockingUnaryCall[TRequest,TResponse](CallInvocationDetails`2 call, TRequest req)
   在 Grpc.Core.DefaultCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method`2 method, String host, CallOptions options, TRequest request)
   在 Grpc.Core.Internal.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method`2 method, String host, CallOptions options, TRequest request)
   在 Helloworld.Greeter.GreeterClient.GetUsers(SearchUserRequest request, CallOptions options) 位置 E:\MyTest\grpc-1.0.x\examples\csharp\helloworld\Greeter\HelloworldGrpc.cs:行号 148
   在 Helloworld.Greeter.GreeterClient.GetUsers(SearchUserRequest request, Metadata headers, Nullable`1 deadline, CancellationToken cancellationToken) 位置 E:\MyTest\grpc-1.0.x\examples\csharp\helloworld\Greeter\HelloworldGrpc.cs:行号 144
   在 GreeterClient.Program.Main(String[] args) 位置 E:\MyTest\grpc-1.0.x\examples\csharp\helloworld\GreeterClient\Program.cs:行号 71

在服务端出现异常

W1024 09:56:49.886636 Grpc.Core.Internal.UnaryServerCallHandler`2 Exception occured in handler. System.ArgumentException: 值不在预期的范围内。
   在 Grpc.Core.Internal.UnaryServerCallHandler`2.<HandleCall>d__0.MoveNext()
W1024 09:56:49.889643 Grpc.Core.Server Exception while handling RPC. System.InvalidOperationException: Error sending status from server.
   在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   在 Grpc.Core.Internal.UnaryServerCallHandler`2.<HandleCall>d__0.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
   在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   在 Grpc.Core.Server.<HandleCallAsync>d__11.MoveNext()

解决方法

出现这个问题是grpc对默认的消息大小(massage size)做了限制,限制的值在各个版本中还不太一样,为了让grpc的效率更高,开发者认为应该不要太大,4M比较合适。

但实际应用中,虽然可以规定编写contract要合理,但是还会很多大的对象。

解决方法是手动设置messagesize的值。

问题1 是没有在客户端设置messagesize,接收到大的对象后客户端无法解析。问题2 是在服务端没有设置messagesize,服务端无法解析发送来的消息。

在服务端需要的代码

 var options = new List<ChannelOption> {
                new ChannelOption(ChannelOptions.MaxMessageLength,int.MaxValue)
            };
 Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure, options);

在客户端需要的代码

Server server = new Server(new List<ChannelOption> { new ChannelOption(ChannelOptions.MaxMessageLength, int.MaxValue) })
{
        Services = { Greeter.BindService(new GreeterImpl()) },
        Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
 };
 

到底这个值设置为多少合理,如果设置到int.MaxValue,对性能有什么影响,在后面使用中逐步体会。

时间: 2024-12-21 11:51:06

C# 使用 grpc 问题汇总的相关文章

python grpc 应用

1.rpc介绍 2.grpc 3.基于grpc协议文件传输 4.基于grpc协议jmeter压测获取实时结果 5.基于grcp协议获取jmeter最终压测报告,并将报告保存至client端 6.压测中途停止jmeter grpc server (jmeter server)  192.168.18.128 rpc client (本机) 1.rpc协议介绍 RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不

从Protocol Buffers 到 gRPC

从Protocol Buffers 到 gRPC 我们项目中准备使用Protocol Buffers来进行服务器和客户端的消息交互,采用gRPC开源框架,服务器使用Java,客户端有Android和iOS. 从Protocol Buffers 到 gRPC 一Protocol Buffers 文档 使用 1 定义一个消息类型 官方例子 2 字段限制 3 Tags 4 具体使用 Protoc源码的编译以及使用 1 安装ProtocolBuffer工具 2 使用protoc编译proto文件 二gR

grpc| python 实战 grpc【h】

title: grpc| python 实战 grpc description: 只要代码可以跑起来, 很多难题都会迎刃而解. so, keep coding and stay hungry. 之前用 swoole 写 server 时就接触过 protobuf, 本来以为基于 protobuf 的 grpc, 上手起来会轻轻松松, 没想到结结实实的折腾了许久, 从 php 开始配置 grpc 需要的环境, 到无奈转到 grpc 最亲和 的 go 语言, 又无奈面对各种 go get 撞墙, 直

部署OpenStack问题汇总(四)--openstack中nova-compute状态status显示为&#39;XXX&#39;的问题

第一次部署openstack的时候就遇见了这个问题,当时的版本是havana, 现在部署essex的时候又遇到了这个问题,经过一番折腾,解决了这个问题,记录下来,以免以后忘记. =========================================================== 1.查看/var/log/nova/nova-compute.log文件其中出现了这样的情况: Domain not found: no domain with matching name 'insta

Nginx&Apache&PHP参数汇总

1.Nginx vim /etc/nginx/conf.d/www.cmdschool.org.conf   client_max_body_size 30m; //上传文件大小改30M   upstream www.cmdschool.org {     server 10.168.82.25:87;     ip_hash;   }   server {     listen 80;     server_name www.cmdschool.org;     location / {   

跟我学SpringMVC目录汇总贴、PDF下载、源码下载

跟我学SpringMVC目录汇总贴.PDF下载.源码下载 http://jinnianshilongnian.iteye.com/blog/1752171 跟开涛学SpringMVC 在线版目录 第一章 Web MVC简介 第二章 Spring MVC入门 第三章 DispatcherServlet详解 第四章 Controller接口控制器详解(1) 第四章 Controller接口控制器详解(2) 第四章 Controller接口控制器详解(3) 第四章 Controller接口控制器详解(

EIGRP汇总后生成的Null0接口和路由黑洞详解

提到Null0接口,就顺便提一下路由黑洞.所谓黑洞路由,顾名思义他就是将所有无关路由吸入其中,使它们有来无回的路由 - 相当于洪水来临时,在洪水途经的路上附近挖一个不见底的巨大深坑,然后将洪水引入其中. 黑洞路由实际是一种特殊的静态路由,就是目的地址为该网段的数据报文到达设备之后,报文将被丢弃.路由黑洞最大的好处是充分利用了路由器的3层数据包转发能力,对系统负载影响非常小,将报文丢弃的操作不需要CPU进行什么专门的处理,所以处理大量的报文也不会消耗设备的CPU资源! 例如,admin建立一个路由

WebGL 支持检测与已支持浏览器版本汇总

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 是否我的浏览器支持 WebGL http://caniuse.com 在页面搜索 webgl,找到  WebGL - 3D Canvas grap

TCP 协议难点汇总

本文不会完整的介绍TCP,只有在涉及到的时候随便提一下.不适合对TCP整个流程和框架没有了解过的人阅读. 1  TCP 四次挥手中的TIME_WAIT状态的意义何在. 下图四次挥手的一个大体的流程 我们发现在A发送完一个最后一个ACK后,B一收到这个ACK就证明关闭请求已经被确认了,所以可以直接关闭.但是这时候A怎么知道这个ACK是否已经到达了对端呢?这个时候为了保证双方能够正常关闭,就引入了一个MSL时间,MSL定义 "一个电磁波信号在地球最大的存活时间 " . 所以该ACK存活一个