【问题标题】:gRPC IFeatureCollection has been disposed. Object name: 'Collection'gRPC IFeatureCollection 已被释放。对象名称:“收藏”
【发布时间】:2020-11-03 16:26:48
【问题描述】:

使用我拥有的 c# gRPC 服务器 IServerStreamWriter<ClientNotification> ClientNotificationStream发送用户通知

当我试图打电话给ClientNotificationStream.WriteAsync(parameters) 我有

System.ObjectDisposedException: 'IFeatureCollection has been disposed.
Object name: 'Collection'.'```

IFeatureCollection has been disposed.
Object name: 'Collection'.. Internal Error:  StackTrace:    at Microsoft.AspNetCore.Http.Features.FeatureReferences`1.ThrowContextDisposed()
   at Microsoft.AspNetCore.Http.Features.FeatureReferences`1.ContextDisposed()
   at Microsoft.AspNetCore.Http.Features.FeatureReferences`1.Fetch[TFeature](TFeature& cached, Func`2 factory)
   at Microsoft.AspNetCore.Http.DefaultHttpContext.get_RequestAborted()
   at Grpc.AspNetCore.Server.Internal.HttpContextServerCallContext.get_CancellationTokenCore()
   at Grpc.Core.ServerCallContext.get_CancellationToken()
   at Grpc.AspNetCore.Server.Internal.HttpContextStreamWriter`1.WriteAsync(TResponse message)

【问题讨论】:

  • 我怀疑连接从未完成,然后被处理掉了。所以这是一个连接问题(除非你从未创建过对象)。
  • 连接由 gRPC service Connector{ rpc Start(ConnectorRequest) returns (stream ClientNotification); } 创建,用户在调用 Start 方法时收到第一条消息。下次调用 WriteAsync 出错。
  • 您有远程或本地客户端吗?请参阅:docs.microsoft.com/en-us/mem/configmgr/core/clients/manage/…
  • @jdweng 那是我的本地开发服务器。分离 gRPC 服务器和测试 gRPC 客户端。 Thay 都在我的本地服务器上运行。
  • 我添加了deadline:DateTime.UtcNow.AddMinutes(5)。之后我得到Error: The CancellationTokenSource has been disposed.. Internal Error: StackTrace: at System.Threading.CancellationTokenSource.ThrowObjectDisposedException() at System.Threading.CancellationTokenSource.get_Token() at Grpc.AspNetCore.Server.Internal.ServerCallDeadlineManager.get_CancellationToken() at Grpc.AspNetCore.Server.Internal.HttpContextServerCallContext.get_CancellationTokenCore() at Grpc.Core.ServerCallContext.get_CancellationToken()

标签: c# grpc .net-core-3.1


【解决方案1】:

ClientNotificationStream 在我需要执行 WriteAsync() 时被释放。要修复它,我添加

WaitHandle.WaitAny(new[] { context.CancellationToken.WaitHandle });

contextServerCallContext

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多