2014-11-09 6 views
8

Ich versuche herauszufinden, ob es möglich ist, die "Anfragegebühr" zu erhalten, wenn DocumentDB Query-Anfragen über die mitgelieferte .NET-Client-Bibliothek durchgeführt werden. Die Details kommen in dem zugrunde liegenden HTTP-Header "x-ms-request-charge" zurück, den ich über Fiddler etc. überwachen kann, würde es aber bevorzugen, wenn ich es direkt über .NET bekommen könnte.Ermitteln von DocumentDB Request Gebühren pro Abfrage über .NET

Hat jemand das getan? Oder zumindest in der Lage zu bestätigen, wenn es einfach nicht möglich ist?

Update:

Added Klarstellung, dass ich nach dem Gesuch bin, wenn Abfragen und nicht andere Operationen.

Antwort

10

Sie sollten in der Lage sein, das über die .Net-Bibliothek zu bekommen. Schauen Sie sich zum Beispiel den folgenden Screenshot an, der Ihnen die Antwort einer Operation Create New User zeigt. Das Ergebnis ist vom Typ Microsoft.Azure.Client.ResourceResponse<T>, das eine Eigenschaft namens RequestCharge hat.

enter image description here

UPDATE

So überprüfte ich das Abfrageergebnis und Sie sind richtig, dass dies nicht direkt in der Net-Bibliothek ausgesetzt ist. Dies ist jedoch in ResponseHeaders Eigenschaft vorhanden und man könnte es vielleicht etwas mit wie unten herausfinden:

FeedResponse<Microsoft.Azure.Documents.Document> queryResult = await documentClient.CreateDocumentQuery<Microsoft.Azure.Documents.Document>(collectio‌​nSelfLink, query, options).AsDocumentQuery().ExecuteNextAsync<Microsoft.Azure.Documents.Document>(‌​); 
var requestCharge = queryResult.ResponseHeaders["x-ms-request-charge"]; 

statt es in Fiddler Inspektion.

HINWEIS

ExecuteNextAsync eine Teilmenge der Ergebnisse mit einer Fortsetzungstoken zurückgeben kann. Wenn Sie alle Ergebnisse wünschen, müssen Sie iterieren, bis db nicht mehr ein Fortsetzungstoken sendet.

var docDbQueryable = documentClient.CreateDocumentQuery<Document>(collectio‌​nSelfLink, query, options).AsDocumentQuery(); 
var docDbResults = new List<Document>(); 
do 
{ 
    var batchResult = await docDbQueryable.ExecuteNextAsync<Document>(‌​);; 
    docDbResults.AddRange(batchResult); 
} 
while (docDbQueryable.HasMoreResults); 
return docDbResults; 
+0

Ahh vielleicht sollte ich mehr klar gewesen. Ich habe speziell über Abfragen gesprochen, die nicht "CreateXYZ" usw. sind. Meine schlechte, wird meine ursprüngliche Frage ändern. –

+0

Entschuldigung! Eigentlich war es mein Schlechter :). Sie haben Frage in Ihrer ursprünglichen Frage erwähnt. Wie auch immer, aktualisierte meine Antwort mit einem Workaround. HTH. –

+0

Ich sehe das überhaupt nicht. Dies geschieht über den Aufruf DocumentClient.CreateDocumentQuery(). Hast du etwas anderes versucht? –

4

Hier ist, was Sie die Kosten für jede Abfrage anmelden müssen und auch Paging-Griff:

public async Task<IEnumerable<T>> Query<T>(string databaseId, string collectionId, SqlQuerySpec sqlQuery, int take) 
where T : Resource 
{ 
    double queryCost = 0; 
    const int maxPageSize = 100; 

    var query = _client.CreateDocumentQuery<T>(
     UriFactory.CreateDocumentCollectionUri(databaseId, collectionId), 
     sqlQuery, 
     new FeedOptions() {MaxItemCount = Math.Min(maxPageSize, take)}).AsDocumentQuery(); 

    var response = await query.ExecuteNextAsync<T>(); 
    queryCost += response.RequestCharge; 
    var entities = response.ToList(); 

    while (entities.Count < take && query.HasMoreResults) 
    { 
     var nextResponse = await query.ExecuteNextAsync<T>(); 
     queryCost += nextResponse.RequestCharge; 
     entities.AddRange(nextResponse); 
    } 

    Debug.WriteLine(
     "Query [{0}] for {1} documents in collection [{2}] cost {3} RUs.", 
     sqlQuery.QueryText, 
     take, 
     collectionId, 
     queryCost); 

    return entities.Take(take).ToList(); // We may end up with more than the requested number of items. 
} 
Verwandte Themen