我想在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,那么客户端服务器是否可以访问他的相关数据?
答案 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
根据您需要保存的频率(例如每秒一次),此策略应始终生成唯一密钥。