gRPC C#服务器端,等到客户端关闭连接?

时间:2020-02-07 15:18:29

标签: c# grpc

我正在创建一个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;
    }
}

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

1 个答案:

答案 0 :(得分:0)

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

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

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