Ken*_*ner 9 c# azure azure-cosmosdb
我试图弄清楚在通过提供的.NET客户端库执行DocumentDB查询请求时是否可以获得"请求费用".详细信息返回底层的HTTP标题"x-ms-request-charge",我可以通过Fiddler等进行监控,但如果我可以通过.NET直接获取它,则会更喜欢.
有没有人这样做过?或者至少能够确认它是否根本不可能?
更新:
添加说明我在执行查询而不是其他操作时请求收费.
Gau*_*tri 12
你应该能够通过.Net库获得它.例如,请查看下面的屏幕截图,其中显示了Create New User操作的响应.结果是Microsoft.Azure.Client.ResourceResponse<T>具有称为属性的类型RequestCharge.

UPDATE
所以我检查了查询结果,你是正确的,这不是直接在.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"];
Run Code Online (Sandbox Code Playgroud)
而不是在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;
Run Code Online (Sandbox Code Playgroud)
以下是记录每个查询的成本以及处理分页所需的内容:
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.
}
Run Code Online (Sandbox Code Playgroud)