10

我试图弄清楚通过提供的 .NET 客户端库执行 DocumentDB 查询请求时是否可以获得“请求费用”。详细信息会在底层 HTTP 标头“x-ms-request-charge”中返回,我可以通过 Fiddler 等进行监控,但如果我可以直接通过 .NET 获取它,我会更喜欢。

有人做过吗?或者至少能够确认它是否根本不可能?

更新:

添加了说明,即我在执行查询而不是其他操作时会收取请求费用。

4

2 回答 2

12

您应该能够通过 .Net 库获得它。例如,看一下下面的屏幕截图,它显示了Create New User操作的响应。结果是Microsoft.Azure.Client.ResourceResponse<T>具有名为 的属性的类型RequestCharge

在此处输入图像描述

更新

所以我检查了查询结果,你说得对,这没有直接暴露在 .Net 库中。但是,这在ResponseHeaders属性中可用,您可以使用以下内容找到它:

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

而不是在 Fiddler 中检查它。

笔记

ExecuteNextAsync可能会返回带有延续标记的结果子集。如果您想要所有结果,则必须迭代直到文档 db 不向 abck 发送延续令牌。

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;
于 2014-11-09T21:21:26.950 回答
7

这是您记录每个查询的成本并处理分页所需的内容:

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.
}
于 2015-12-03T03:10:55.453 回答