0

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呼び出しが行われるため、費用がかかります。多分それがなぜこのように機能するのでしょうか?

おかげ

+0

、私はGoogle.Cloud.Firestore、うまくいけば、この四半期に、このAPIを実装するつもりです。進捗状況については、次のURLをご覧ください:https://github.com/GoogleCloudPlatform/google-cloud-dotnet/issues/1618 –

答えて

0

ジョンは公式サポートを終了するまで、あなたがすぐにそれを必要とする場合、あなたは私が一緒に入れて何かを使用することができます。 https://github.com/cleversolutions/FirebaseDotNetRamblings/blob/master/FirebaseDocumentListener.csそのあなたのプロジェクトにドロップすると、次のように使用することができます拡張メソッド:ちょうどメモとして

//Create our database connection 
FirestoreDb db = FirestoreDb.Create(projectId); 

//Create a query 
CollectionReference collection = db.Collection("cities"); 
Query qref = collection.Where("Capital", QueryOperator.Equal, true); 

//Listen to realtime updates 
FirebaseDocumentListener listener = qref.AddSnapshotListener(); 

//Listen to document changes 
listener.DocumentChanged += (obj, e) => 
{ 
    var city = e.DocumentSnapshot.Deserialize<City>(); 
    Console.WriteLine(string.Format("City {0} Changed/Added with pop {1}", city.Name, city.Population)); 
}; 
関連する問題