我试图弄清楚通过提供的 .NET 客户端库执行 DocumentDB 查询请求时是否可以获得“请求费用”。详细信息会在底层 HTTP 标头“x-ms-request-charge”中返回,我可以通过 Fiddler 等进行监控,但如果我可以直接通过 .NET 获取它,我会更喜欢。
有人做过吗?或者至少能够确认它是否根本不可能?
更新:
添加了说明,即我在执行查询而不是其他操作时会收取请求费用。
我试图弄清楚通过提供的 .NET 客户端库执行 DocumentDB 查询请求时是否可以获得“请求费用”。详细信息会在底层 HTTP 标头“x-ms-request-charge”中返回,我可以通过 Fiddler 等进行监控,但如果我可以直接通过 .NET 获取它,我会更喜欢。
有人做过吗?或者至少能够确认它是否根本不可能?
更新:
添加了说明,即我在执行查询而不是其他操作时会收取请求费用。
您应该能够通过 .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>(collectionSelfLink, 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>(collectionSelfLink, query, options).AsDocumentQuery();
var docDbResults = new List<Document>();
do
{
var batchResult = await docDbQueryable.ExecuteNextAsync<Document>();;
docDbResults.AddRange(batchResult);
}
while (docDbQueryable.HasMoreResults);
return docDbResults;
这是您记录每个查询的成本并处理分页所需的内容:
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.
}