Tim Blog

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:行号 144GreeterClient.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,对性能有什么影响,在后面使用中逐步体会。

posted @ 2016-10-24 19:40 流沙 阅读(8997) 评论(1) 推荐(0) 编辑
摘要: 自从开发H5,就不断被各种手机的怪现象打败。一个非常简单的页面,需要上传照片,H5实现这个功能超easy,直接在页面写入点击这个input,便可呼叫出拍照功能。拍照、压缩、显示、上传。。。。狗血的事情发生在6plus上,使用拍照功能,时不时就会导致浏览器崩溃。测试了4台手机,出现的频率相当大。这就是... 阅读全文
posted @ 2015-09-10 18:02 流沙 阅读(2187) 评论(0) 推荐(0) 编辑
摘要: (3)将数据写入Excel把数据写入到Excel文件是本文的关键技术。这里需要用到OpenXml。在Sdk里已经提供了足够的文件操作方法,我们就调用这些方法,将数据源的数据写到文件中。首先我们定义了一些工具类,用于读取单元格的行列值。在Excel中,每个单元格都有一个地址:如B3表示第二行第三列的格... 阅读全文
posted @ 2014-08-04 22:38 流沙 阅读(1433) 评论(0) 推荐(0) 编辑
摘要: 我们在做应用系统中经常需要将数据库中的数据导出成为Excel文件。如果是要导出报表的话,最好是能够根据定义好的模版生成一个美观的Excel。 以前要生成有样式的Excel。一般是使用Xml形式的Excel修改,或者使用Excel的Api。前者要修改样式的话特别麻烦,后者在Asp.net里会起很多进程。 庆幸的是从office 2007开始,微软使用了OpenXml来定义office的文件。使用rar将xlsx文件解压,可以看到很多的xml格式文件,这里每个文件的内容和含义我就不解释了,需要了解的可以看微软的手册。下面介绍如何用Open Xml的Sdk来操作这些xml文件的内容,实现数据库数据导出为excel文件。 阅读全文
posted @ 2014-08-01 00:03 流沙 阅读(924) 评论(0) 推荐(0) 编辑
摘要: 在Excel中选择要复制的区域,“复制”后在剪切板中的Text形式内容是以Tab分隔的。要实现“粘贴”的功能,只需要获取剪切板中文本,然后根据换行“\n”得到每行数据,再将行根据“\t”分割得到对应Cell中的数据,赋值给Td中的Element。这个过程重点是js如何访问到剪切板的内容。在IE浏览器... 阅读全文
posted @ 2014-07-31 00:26 流沙 阅读(3906) 评论(0) 推荐(0) 编辑
摘要: 同事离职,交接到我手上一个web应用。本机上试用了一下没有问题。这两天发布到IIS上,问题大事儿了。 服务器是win2003+IIS6 客户端是win8+ie10 保存操作提示 但是在IE其他版本以及chrome等浏览器下没有这个问题。 一开始以为是程序的bug,到处添加debug信息排错。最后发现是在pageinitcomplete之后,pagepreload之前。应该是控件加载时的错误。 比... 阅读全文
posted @ 2013-07-18 16:21 流沙 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 最近接手一个项目的开发工作,希望目标是通过输入一些数据,自动生成一个word格式的文档。其实这个点子很不错,但是单位要求做成在线版本,让我觉得不是太认可。我觉得通过插件的形式更方便,用户体验会更完美!以前写论文的时候,用过NoteExpress,就是将文献全部整理到一个数据库里,写论文的时候,用了哪一篇文章,直接选中插入,文章的信息便插入到word中。修改数据库中的数据,只要在word中同步并F9,数据就过来了。对写参考文献帮助很大。那我的目标就是编写一个类似的东西。大概结构我想这个样子分成两个部分,一个是数据维护系统PBData,一个是Word插件 PBAddIn,二者之间通过一个XML格式 阅读全文
posted @ 2012-06-10 00:18 流沙 阅读(503) 评论(0) 推荐(0) 编辑
摘要: 参考:http://blog.csdn.net/akipeng/article/details/6534375http://www.haogongju.net/art/19029首先建立一个Word外接程序(Word AddIn)(家里的Vs竟然是中文版,汗!)接着在项目中新增项,选择“功能区(可视化设计)”这时候就给我的插件建立一个Ribbon的菜单。删掉自动生成的group1。然后新建一个tab,取名为“自动文档”。在这个tab里增加一个group“测试区”,然后加一个button,点击这个按钮,在word增加“hello word”。关于word文档的操作,还是需要明确一些概念的。搜到这 阅读全文
posted @ 2012-06-10 00:18 流沙 阅读(444) 评论(0) 推荐(0) 编辑
摘要: 最近接到一个紧急的任务,构建一个企业门户。首先需要一个cms。刚好手头有一套以前的,拿过来先暂时凑个数。准备以后依次为契机,自己做一个cms。科技经费与资源信息网。http://www.nstf.org.cn.这个cms如何做?准备下面几步:1)找几个典型的cms做参考,熟悉基本的功能。2)确定 模板、内容发布、静态页面生成 几个技术点的解决方法。3)确定项目的架构。4)编写代码、测试。 阅读全文
posted @ 2011-11-16 23:17 流沙 阅读(466) 评论(0) 推荐(0) 编辑
摘要: 两个实体之间连接有内连接和外连接两种,因此在Entity引用关系上需要增加JoinType的属性,改属性值要使用枚举,为InnerJoin或者LeftJoin。 在DSL Explorer中选择根节点,右键添加Domain Enumeration,修改名字为EntityJoinType,增加两个枚举值为InnerJoin和LeftJoin。 阅读全文
posted @ 2011-10-28 13:28 流沙 阅读(320) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示