如何在Worker Role中托管的Web API中获取客户端服务器的唯一标识符

时间:2015-11-17 18:25:40

标签: c# azure asp.net-web-api azure-worker-roles

我想在WebApi中获取一些客户端服务器的唯一标识符,该标识符托管在Azure辅助角色中。

我想在内部数据库中使用它作为标识符,内部数据库由表存储组成,以保持处理数据不受工人角色的影响。

例如,我在Web Api中有POST方法,它接受一些字符串并将其放入队列:

public void Post([FromBody]string value)
{            
      if (value != null)
      {
            Queue.Enqueue("requests", value);
      }
}

然后,Worker Role处理此字符串并将结果保存到表存储

while (true)
{
    Thread.Sleep(1000);
    Trace.TraceInformation("Working", "Information");

    if(Queue.Count("requests") > 0)
    {

        String req = Queue.Dequeue("requests");
        //do some work with string, for example return length of string

        ResponseEntity re = new ResponseEntity(UNIQUEIDENTIFIER_of_client_server, req.Length.ToString());
        CloudTable table = Table.ReturnTable("responses");
        TableBatchOperation tbo = new TableBatchOperation();
        tbo.Insert(re);
        table.ExecuteBatch(tbo);
        Trace.TraceInformation("Done some work", "Information");
    }
}

最后,客户端服务器可以通过Web API中的GET方法的唯一标识符访问其结果:

  public string Get(string UNIQUEIDENTIFIER_of_client_server)
  {
      string response = Table.GetResponseById("responses", UNIQUEIDENTIFIER_of_client_server);
      return response;
  } 

你有什么想法,我怎么做?或者我应该采用另一种方式来获取UNIQUEIDENTIFIER_of_client_server,那么客户端服务器是否可以访问他的相关数据?

1 个答案:

答案 0 :(得分:0)

由于Azure存储表中没有auto increment primary key,因此您需要自己构建密钥。

Azure存储表主键partition key and row key组成。

重要的是要知道,

  • 每个分区键(顾名思义)将存储的数据放在不同的分区中
  • 每个行键都是任何给定分区中的主键
  • 然后您可以按分区和行键组合搜索

文章What PartitionKey and RowKey are for in Windows Azure Table Storage中解释得非常好。

您需要分析要存储的数据并确定您的密钥创建策略。

最好的选择可能是您要保存的实体属性的组合。可以在本文How to use Table storage from .NET中找到一个示例。

另一种可能的解决方案是创建 month-day (作为分区键)和 GUID (作为行键)的组合 - 这样你就会有不同的行每天的密钥,每天将存储在一个分区中,例如:

11-17-2f0f97a8-c2f4-475e-b1d3-d1eab0f19739
11-17-b18f0932-11ff-49cd-9724-70494ea40f5b

如果您每月存储一次值,那么最好使用year-GUID,这样就不会在不同的分区上传播不必要的数据。

如果分区和搜索对您当前的项目不重要,那么只需使用时间戳,例如键年 - 月 - 日(作为分区键)和小时 - 分钟 - 秒毫秒(作为行键):

2015-11-17-19-58-45-034
2015-11-17-19-59-52-349

根据您需要保存的频率(例如每秒一次),此策略应始终生成唯一密钥。