我们有使用 Grpc.Net.Client 包的 gRPC 客户端——当服务创建并设置异步回调时,要知道服务是否已启动并正确连接似乎并不容易。
我们当前的解决方案是通过 HttpRequestException 等待异步调用失败(大约一秒钟后),然后我们返回并尝试在一个长时间运行的循环中再次订阅服务,直到我们恢复并运行服务。有没有一种方法可以 a) 在我们尝试调用我们的 subscribe 方法之前确定服务的状态,并且 b) 有没有比捕获异常和循环更好的方法来处理我们的服务?
请注意,即使服务关闭,服务的创建和对订阅的调用也会正常工作并返回而不会出错,并且 foreach 循环会被执行,然后大约 1 秒后会引发异常。我也真的不想依赖睡眠声明!
代码看起来像这样:
service = channel.CreateGrpcService<IManagedOrderGRPCService>();
while(true)
{
var response = this.Subscribe(), default);
await foreach (var update in response)
{
// Do something with the update
}
catch (Exception e)
{
log.LogWarning ($"[{Name}]:: Lost connection to service - for [{e.Message}]");
}
Thread.Sleep (7000);
}
有关服务声明的信息(使用代码优先 gRPC,.net Core 5):
[ServiceContract]
public interface IManagedOrderGRPCService
{
[OperationContract]
IAsyncEnumerable<ManagedOrderUpdate> Subscribe (CallContext context = default );
}