2014-11-09 17 views
8

Ürünle birlikte verilen .NET istemci kitaplığı aracılığıyla DocumentDB sorgu istekleri gerçekleştirilirken "istek ücreti" alınmasının mümkün olup olmadığını anlamaya çalışıyorum. Detaylar, Fiddler vb. Aracılığıyla izleyebildiğim temel HTTP üstbilgisinde "x-ms-request-charge" yazıyor, ancak doğrudan .NET üzerinden alabiliyordum.DocumentDB İstekini Belirleme Sorgu başına ücret sorgusu aracılığıyla .NET

kimse bu yapılır mı? Ya da en azından mümkün değilse onaylamak mümkün mü?

Güncelleme: diğer işlemleri sorgulama yapılarak ve değilken ben istek ücret peşindeyim

Eklendi açıklama.

cevap

10

Bunu .Net kitaplığından edinebilmelisiniz. Örneğin, bir Create New User işleminin yanıtını gösteren aşağıdaki ekran görüntüsüne bir göz atın. Sonuç, RequestCharge adı verilen bir özelliğe sahip Microsoft.Azure.Client.ResourceResponse<T> tipindedir.

enter image description here

GÜNCELLEME Bu yüzden sorgu sonucunu kontrol ettik ve bu .Net kütüphanesinde doğrudan maruz kalmayacağı bir doğru. Ancak bu ResponseHeaders özelliği mevcuttur ve muhtemelen aşağıda gibi bir şey kullanarak dışarı bulabiliriz: yerine Fiddler'da İncelemeden arasında

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"]; 

.

NOT

ExecuteNextAsync devamıdır belirteciyle sonuçlarının bir alt kümesini döndürebilir. Tüm sonuçları istiyorsanız, belge db bir devam belirteci göndermeyene kadar yinelemeniz gerekir.

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 belki daha net olması gerekirdi. Özellikle "CreateXYZ" değil sorgular hakkında konuşuyordum. Benim kötü, orijinal sorumu değiştirecek. –

+0

Üzgünüz! Aslında benim kötüyüm :). Orijinal sorunuzda sorgudan bahsettiniz. Her neyse, cevabımı bir geçici çözümle güncelledi. HTH. –

+0

Bunu hiç görmüyorum. Bu DocumentClient.CreateDocumentQuery() çağrısı yoluyla. Başka bir şey mi deniyordun? –

4

Burada her bir sorgu için maliyeti log ve ayrıca sayfalama işlemek için gerekenler:

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. 
} 
İlgili konular