0

我在 Windows azure 应用程序上的 azure tablestorage api 调用出现缓慢行为。我需要获取特定调用的请求 ID(响应标头中的 x-ms-request-id)。有没有办法使用 storageclient api 来获取它?存储客户端 api 是否甚至公开了这个 id?如果没有,还有其他方法可以获取此 ID 吗?

我通过以下方式使用api:

        public UserDataModel GetUserData(String UserId)
    {
        UserDataModel osudm = null;
        try
        {
            var result = (from c in GetServiceContext().OrgUserIdTable
                          where (c.RowKey == UserId)
                          select c).FirstOrDefault();

            UserDataSource osuds = new UserDataSource(this.account);
            osudm = osuds.GetUserData(result.PartitionKey, result.UserName);
        }
        catch (Exception e)
        {
        }
        return osudm;
    }
4

1 回答 1

4

您在此处询问的内容更多与 WCF 数据服务相关,而不是与 Windows Azure 相关(存储客户端客户端 API 使用它)。以下是一些示例代码,您可以如何访问响应标头:

    var tableContext = new MyTableServiceContext(...);
    DataServiceQuery<Order> query = tableContext.Orders.Where(o => o.RowKey == "1382898382") as DataServiceQuery<Order>;
    IEnumerable<Order> result = query.Execute();
    QueryOperationResponse response = result as QueryOperationResponse;

    string requestId;
    response.Headers.TryGetValue("x-ms-request-id", out requestId);

因此,您首先要做的就是创建您的查询并将其转换为 TType 的 DataServiceQuery。然后,您可以对该查询调用Execute方法并将其转换为QueryOperationResponse。此类将使您可以访问所有标头,包括x-ms-request-id

请注意,在这种情况下,您将无法使用FirstOrDefault,因为这不会返回IQueryable并且您无法将其强制转换为 TType 的 DataServiceQuery(除非有其他方法可以使用 WCF 数据服务)。

注意:调用这么慢的原因可能是您的查询引起的。当您查询OrgUserIdTable表时,您只根据 RowKey 进行筛选。我不知道您在该表中有多少数据或分区,但如果您不使用 PartitionKey,这可能会对性能产生重大影响。您必须知道,如果不包括 PartitionKey,您将强制搜索所有分区(可能在多个服务器上),这可能会导致调用如此缓慢。

我建议您查看以下实际指南,以更好地了解分区如何以及为什么与 Windows Azure 存储中的性能相关:为 Windows Azure 表存储设计可扩展分区策略

于 2012-07-29T07:25:42.337 回答