返回双向 GRPC 方法的最佳方式 .NET 5 C#

问题描述

 public override async Task DO(IAsyncStreamReader<Request> requestStream,IServerStreamWriter<Response> responseStream,ServerCallContext context)
    {
        
        try
        {


            while (!context.CancellationToken.IsCancellationRequested && await requestStream.MoveNext())
            {
                var message = requestStream.Current;
                switch (message.RequestUnionCase)
                {
                    case RequestUnionOneofCase.InitMessage:
                        isInitMessageDone = true;

                        var status = new Response
                        {
                            Status = new Status
                            {
                                Code = 100,Details = "Continue",}
                        };

                        await responseStream.WriteAsync(status);

                        break;
                    case RequestUnionOneofCase.C: break;
                    case RequestUnionOneofCase.A:
                        isDone = true;
                        break;

                    case RequestUnionOneofCase.None: break;
                    default: break;
                }
            }               


            if (isInitMessageDone && isDone)
            {
                var status = new Response
                {
                    Status = new Status
                    {
                        Code = 200,Details = "Success"
                    }
                };
                await responseStream.WriteAsync(status);
                Response finalResult = await this._responseMessageHandler.ProcessResultAsync();
                finalResult.Result.ResultType = EnumResultType.Final;
                await responseStream.WriteAsync(finalResult);
            }
        }
        catch (Exception e)
        {
            
        }
    }
  1. 上述代码中关于优雅地返回方法的问题是什么。
  2. 客户端完成发送请求流后如何写流 多次运行 100 个用户时出现以下异常。

Microsoft.AspNetCore.Connections.ConnectionAbortedException 在 Grpc.AspNetCore.Server.Internal.PipeExtensions+d__14`1.MoveNext

  1. 以下是我在使用所有认设置时遇到相同错误的 Kestrel 设置

    options.Limits.MaxConcurrentConnections = 10000; options.Limits.MaxConcurrentUpgradedConnections = 10000; options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(20); options.Limits.Http2.MaxStreamsPerConnection = 10000;

服务器 在 Grpc.AspNetCore.Server.Internal.PipeExtensions+d__141.MoveNext type Microsoft.AspNetCore.Connections.ConnectionAbortedException assembly Grpc.AspNetCore.Server,Version=2.0.0.0,Culture=neutral,PublicKeyToken=d754f35622e28bad method Grpc.AspNetCore.Server.Internal.PipeExtensions+<ReadStreamMessageAsync>d__141.MoveNext 的问题 ID Microsoft.AspNetCore.Connections.ConnectionAbortedException 外部类型 System.IO.IOException externalMessage 请求流被中止。 externalAssembly System.Private.CoreLib,版本=5.0.0.0,文化=中性,PublicKeyToken=7cec85d7bea7798e 外部方法 System.Runtime.ExceptionServices.ExceptiondispatchInfo.Throw innermostType Microsoft.AspNetCore.Connections.ConnectionAbortedException innermostMessage HTTP/2 连接出错。

{"assembly":"System.Private.CoreLib,Version=5.0.0.0,PublicKeyToken=7cec85d7bea7798e","method":"System.Runtime.ExceptionServices.ExceptiondispatchInfo.Throw","level": 0,"行":0}1 {"assembly":"system.io.pipelines,Version=5.0.0.1,PublicKeyToken=cc7b13ffcd2ddd51","method":"system.io.pipelines.PipeCompletion.ThrowLatchedException","level":1,"行":0} {"assembly":"system.io.pipelines,"method":"system.io.pipelines.Pipe.GetReadResult","level":2,"method":"system.io.pipelines.Pipe.GetReadAsyncResult","level":3,"行":0} {"assembly":"Microsoft.AspNetCore.Server.Kestrel.Core,PublicKeyToken=adb9793829ddae60","method":"Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2. Http2MessageBody+d__9.MoveNext","level":4,"line":0} {"assembly":"System.Private.CoreLib,"level":5,"行":0} {"assembly":"System.Private.CoreLib,"method":"System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess","level":6,"行":0} {"assembly":"Grpc.AspNetCore.Server,PublicKeyToken=d754f35622e28bad","method":"Grpc.AspNetCore.Server.Internal.PipeExtensions+d__141.MoveNext","level":7,"line":0} {"assembly":"System.Private.CoreLib,"level":8,"level":9,"method":"System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification","level":10,"method":"System.Threading.Tasks.ValueTask1. get_Result","level":11,"line":0} {"assembly":"Grpc.AspNetCore.Server,"method":"Grpc.AspNetCore.Server.Internal.HttpContextStreamReader1+<<MoveNext>g__MoveNextAsync|9_0>d.MoveNext","level":12,"level":13,"level":14,"line":0} {Category} {SessionId} {MessageId} Exception during Responder Reader Task,Exception message: Status(StatusCode="Unavailable",Detail="Error starting gRPC call. HttpRequestException: An error occurred while sending the request. IOException: The request was aborted. IOException: The response ended prematurely,with at least 9 additional bytes expected.",DebugException="System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.IO.IOException: The request was aborted. ---> System.IO.IOException: The response ended prematurely,with at least 9 additional bytes expected. at System.Net.Http.Http2Connection.ReadAtLeastAsync(Stream stream,Memory1 个缓冲区,Int32 minReadBytes)
在 System.Net.Http.Http2Connection.EnsureIncomingBytesAsync(Int32 minReadBytes) 在 System.Net.Http.Http2Connection.ReadFrameAsync(Boolean initialFrame)
在 System.Net.Http.Http2Connection.ProcessIncomingFramesAsync() ---内部异常堆栈跟踪结束---
在 System.Net.Http.Http2Connection.Http2Stream.CheckResponseBodyState()
在 System.Net.Http.Http2Connection.Http2Stream.TryEnsureHeaders()
在 System.Net.Http.Http2Connection.Http2Stream.ReadResponseHeadersAsync(CancellationToken cancellingToken)
在 System.Net.Http.Http2Connection.SendAsync(HttpRequestMessage request,CancellationToken cancelationToken) --- 内部异常堆栈跟踪结束---
在 System.Net.Http.Http2Connection.SendAsync(HttpRequestMessage 请求,CancellationToken 取消令牌)
在 System.Net.Http.httpconnectionPool.SendWithRetryAsync(HttpRequestMessage 请求,布尔 doRequestAuth,CancellationToken 取消令牌)
在 System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage 请求,CancellationToken 取消令牌)
在 System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage 请求,CancellationToken 取消令牌)
在 Grpc.Net.Client.Internal.GrpcCall2.runcall(HttpRequestMessage request,Nullable1 超时)"),异常堆栈跟踪:
在 Grpc.Net.Client.Internal.HttpContentClientStreamReader`2.MoveNextCore(CancellationToken cancellingToken)

客户 响应者读取器任务期间出现异常,异常消息:状态(状态代码 =“不可用”,详细信息 = 启动 gRPC 调用时出错。HttpRequestException:发送请求时发生错误。 IOException:请求已中止。 IOException: 响应提前结束,预计至少有 9 个额外字节。",DebugException="System.Net.Http.HttpRequestException: 发送请求时出错。 ---> System.IO.IOException: 请求被中止。 ---> System.IO.IOException:响应提前结束,预计至少有 9 个额外字节。
在 System.Net.Http.Http2Connection.ReadAtLeastAsync(Stream stream,Memory1 buffer,Int32 minReadBytes) at System.Net.Http.Http2Connection.EnsureIncomingBytesAsync(Int32 minReadBytes) at System.Net.Http.Http2Connection.ReadFrameAsync(Boolean initialFrame) at System.Net.Http.Http2Connection.ProcessIncomingFramesAsync() --- End of inner exception stack trace --- at System.Net.Http.Http2Connection.Http2Stream.CheckResponseBodyState() at System.Net.Http.Http2Connection.Http2Stream.TryEnsureHeaders() at System.Net.Http.Http2Connection.Http2Stream.ReadResponseHeadersAsync(CancellationToken cancellationToken) at System.Net.Http.Http2Connection.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken) --- End of inner exception stack trace --- at System.Net.Http.Http2Connection.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken) at System.Net.Http.httpconnectionPool.SendWithRetryAsync(HttpRequestMessage request,Boolean doRequestAuth,CancellationToken cancellationToken) at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken) at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken) at Grpc.Net.Client.Internal.GrpcCall2.runcall(HttpRequestMessage request,Nullable1 timeout)"),Exception stacktrace: at Grpc.Net.Client.Internal.HttpContentClientStreamReader2.MoveNextCore(CancellationToken cancellingToken)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)