【问题标题】:gRPC C# server side, waiting until client closes connection?gRPC C#服务器端,等到客户端关闭连接?
【发布时间】:2020-02-07 15:18:29
【问题描述】:

我正在创建一个允许客户端公开接口的 gRPC 服务

我的原型文件:

syntax = "proto3";
package Tests;
import "google/protobuf/any.proto";
message ListenTest1EventStream {
    uint64 objectId = 1;
}
message EventTestEvent {
}
service Test1ObjectService {
    rpc ListenEvents (ListenTest1EventStream) returns (stream google.protobuf.Any);
}

我的 C# 服务器:

ISomeService
{
    event EventHandler<EventArgs> TestEvent;
}

public class Server : Test1ObjectService.Test1ObjectServiceBase
{
    private readonly ISomeService _someService;

    public Server(ISomeService someService)
    {
        _someService = someService;
    }

    public override async Task ListenEvents(ListenTest1EventStream request, IServerStreamWriter<Any> responseStream, ServerCallContext context)
    {
        // Begin monitoring event handlers, wait indefinitely 
        var handler = new EventHandler<EventArgs>((sender, args) =>
        {
            responseStream.WriteAsync(Any.Pack(new EventTestEvent()));
        });
        _someService.TestEvent += handler;

        // TODO: Wait until response stream is forcibly closed. How?
        await responseStream.WaitForSatusChangedOrSomething();

        _someService.TestEvent -= handler;
    }
}

我如何知道客户端何时断开连接?

【问题讨论】:

    标签: c# grpc


    【解决方案1】:

    当客户端断开连接时,context.CancellationToken 将被取消。将它传递给您的可等待方法,以便它可以终止。

    我这里有一个样本。 https://github.com/cactuaroid/GrpcWpfSample/blob/cd0d87ed6ccccac787960e9742aee036a3dc11eb/GrpcWpfSample.Server/Grpc/ChatServiceGrpcServer.cs#L51

    当给定的CancellationToken 被取消时,ForEachAwaitAsync() 将抛出TaskCanceledException,然后它会捕获异常并记录断开连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2023-04-09
      • 2012-05-22
      • 2010-12-19
      • 2019-06-18
      • 1970-01-01
      相关资源
      最近更新 更多