首页 > 解决方案 > 当服务器使用 WriteAsync 方法时,“响应流已经完成”

问题描述

我得到“响应流已经完成。” 当服务器使用 pi-stream 调用 WriteAsync() 方法时。只有当我使用 Thread.sleep 时,客户端有时才能在睡眠期间获取流。但我知道这不是解决方案。所以请告诉我我该怎么办!

我使用了 .net core 2.2 和 vs community 2019 16.2.3

                proto:
                rpc CppyFile(stream Chunk)returns(stream Back){}

                message Chunk{
                bytes Content=1;
                string FileName=2;
                string Flag=3;
                }

                message Back{
                bytes Content=1;
                UploadStatus statue=2;
                string Flag=3;
                }


                Server:
                await responseStream.WriteAsync(new Back
                            {
                                Content = ByteString.FromStream(stream),
                                Flag = fname,
                                Statue = new UploadStatus
                                {
                                    Message = "2",
                                    Code = UploadStatusCode.Unknown
                                }
                            });


                client:

                using (var call = client.CppyFile())
            {

                try
                {
                    await call.RequestStream.WriteAsync(chunk);
                    Console.WriteLine("Sending");

                        //################################################################################## here's Problem

                        await call.RequestStream.CompleteAsync();
                    //Thread.Sleep(8 * 1000);
                        //##################################################################################

                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throw;
                }

                 var responseReaderTask = Task.Run(async () =>
                { 
                    while (await call.ResponseStream.MoveNext())
                    {
                        var note = call.ResponseStream.Current;    
                                        //get sending from server
                                        ......

这是详细错误。

System.InvalidOperationException:响应流已经完成。在 Grpc.Core.Internal.AsyncCallServer 2.CheckSendAllowedOrEarlyResult() in T:\src\github\grpc\src\csharp\Grpc.Core\Internal\AsyncCallServer.cs:line 195 at Grpc.Core.Internal.AsyncCallBase2.SendMessageInternalAsync(TWrite msg, WriteFlags writeFlags) 在 T:\src\github\grpc\src\csharp\Grpc.Core\Internal\AsyncCallBase.cs:line 124

标签: c#grpc

解决方案


推荐阅读