C#でCloud Firestoreを使ってリアルタイムアップデートを購読しようとしていますが、Google.Cloud.Firestore.V1Beta1
を使用しています。私はストリームが閉じられるまで、短い時間の更新を受け取る次のコードを使用しています。誰もがFirestoreClient.Listen
を持っていますか?FirestoreのリアルタイムアップデートをC#
// Create client
FirestoreClient firestoreClient = FirestoreClient.Create();
// Initialize streaming call, retrieving the stream object
FirestoreClient.ListenStream duplexStream = firestoreClient.Listen();
// Create task to do something with responses from server
Task responseHandlerTask = Task.Run(async() =>
{
IAsyncEnumerator<ListenResponse> responseStream = duplexStream.ResponseStream;
while (await responseStream.MoveNext())
{
ListenResponse response = responseStream.Current;
Console.WriteLine(response);
}
});
// Send requests to the server
var citiesPath = string.Format("projects/{0}/databases/{1}/documents/cities/CJThcwCipOtIEAm2tEMY", projectId, databaseId);
// Initialize a request
var dt = new DocumentsTarget { };
dt.Documents.Add(citiesPath);
ListenRequest request = new ListenRequest
{
Database = new DatabaseRootName(projectId, databaseId).ToString(),
AddTarget = new Target
{
Documents = dt
}
};
// Stream a request to the server
await duplexStream.WriteAsync(request);
// Await the response handler.
// This will complete once all server responses have been processed.
Console.WriteLine("Awaiting responseHandlerTask");
await responseHandlerTask;
編集1: 私は明示的に期限切れにならないために有効期限を設定しようとしましたが、まだ運が、私はその後RST_STREAMを受信中に5分を取得していません。
//Setup no expiration for the listen
CallSettings listenSettings = CallSettings.FromCallTiming(CallTiming.FromExpiration(Expiration.None));
// Initialize streaming call, retrieving the stream object
FirestoreClient.ListenStream duplexStream = firestoreClient.Listen(listenSettings);
編集2: それはその場しのぎのビットのように思えるが、私はそれは、リクエストトークンで要求を再起動し、例外をキャッチし、最後resetTokenを追跡するために働きました。元のリクエストにオプションのresumeTokenを使用させるコードを更新しました。
ListenRequest request = new ListenRequest
{
Database = new DatabaseRootName(projectId, databaseId).ToString(),
AddTarget = new Target
{
Documents = dt
}
};
if (resumeToken != null)
{
Console.WriteLine(string.Format("Resuming a listen with token {0}", resumeToken.ToBase64()));
request.AddTarget.ResumeToken = resumeToken;
}
// Stream a request to the server
await duplexStream.WriteAsync(request);
それは完璧ではないのですが、私はそれはGoogleがNode.js.でそれを実装する方法だと思います5分ごとにAPI呼び出しが行われるため、費用がかかります。多分それがなぜこのように機能するのでしょうか?
おかげ
、私はGoogle.Cloud.Firestore、うまくいけば、この四半期に、このAPIを実装するつもりです。進捗状況については、次のURLをご覧ください:https://github.com/GoogleCloudPlatform/google-cloud-dotnet/issues/1618 –