通过RPC API监听Firestore文档更改

时间:2018-12-26 17:43:56

标签: c# firebase google-cloud-firestore rpc grpc

我目前正尝试通过以下代码段通过Unity应用程序使用Google Firestore提供的RPC API。该代码段基于Protobuffer Definitions和官方gRPC Tutorial,其中显示了如何实现和使用双向流:

public async void ListenTest()
{
    // create cancellation token:
    CancellationTokenSource source = new CancellationTokenSource();
    CancellationToken cancellationToken = source.Token;

    using (AsyncDuplexStreamingCall<ListenRequest, ListenResponse> call = client.Listen())
    {
        // create listenRequest with corresponding properties:
        var listenRequest = new ListenRequest();
        listenRequest.Database = database;
        listenRequest.AddTarget = new Target();
        listenRequest.AddTarget.Documents = new Target.Types.DocumentsTarget
        {
            Documents = { database + "/documents/MyCollection/MyDocument" }
        };

        // task to handle response stream messages
        var responseReaderTask = Task.Run(async () =>
        {
            while (await call.ResponseStream.MoveNext(cancellationToken))
            {
                ListenResponse loc = call.ResponseStream.Current;
                Debug.Log("Received " + loc);
            }
        });

        Debug.Log("Listening for " + database + "/documents/MyCollection/MyDocument");

        // 1. asynchronously send listenRequest
        await call.RequestStream.WriteAsync(listenRequest);

        // 2. wait until listenRequest is sent
        await call.RequestStream.CompleteAsync();

        // 3. handle responses...
        await responseReaderTask;
    }
}

执行此操作会立即终止responseReaderTask,在Firestore中所做的任何更改都不会到达应用程序。

此代码是否有问题?我读了尚未解答的similar question,它为GoLang解释了同样的问题。可能是同一个问题。

通过client.GetDocument(getDocumentRequest)检索单个文档有效。

1 个答案:

答案 0 :(得分:0)

好吧,我发现了我所犯的错误,也许这对子孙后代很有帮助,我只是删除了以下行使其起作用:

    // 2. wait until listenRequest is sent
    await call.RequestStream.CompleteAsync();

AsyncDuplexStreamingCall中,似乎流不是彼此独立的(不同于the example I used as a basis中的两个双向流)。 RequestStream完成后,ResponseStream也终止了,所以我看不到任何变化。 AsyncDuplexStreamingCall中的 Duplex 暗示了这种行为。