我在尝试从Azure TableStorage检索大型数据集时遇到问题。在尝试了几次一次性获得它之后,我放弃了,现在使用TableContinuation Token,它现在没有被正确地反序列化。正在创建对象,但所有下一个。。。值(即NextRowKey、NextPartitionKey等为NULL,当在创建的stringresponse
中时,您可以看到它应该填充的值…
我传递的类包含对象列表和令牌
public class FlorDataset
{
public List<FlorData> Flors { get; set; }
public TableContinuationToken Token { get; set; }
}
控制器代码也不完全是火箭科学。。。。
[HttpGet, Route("api/list/{token}")]
public IHttpActionResult FindAll(string token)
{
try
{
TableContinuationToken actualToken = token == "None"
? null
: new TableContinuationToken()
{
NextPartitionKey = NextPartition,
NextRowKey = token,
NextTableName = NextTableName
};
var x = Run(actualToken);
Flors = x.Flors;
actualToken = x.Token;
NextTableName = actualToken.NextTableName;
NextPartition = actualToken.NextPartitionKey;
return Flors != null
? (IHttpActionResult)new IsoncOkResult<FlorDataset>(x, this)
: NotFound();
}
catch (Exception ex)
{
Trace.TraceError(ex.ToString());
return NotFound();
}
}
private FlorDataset Run(TableContinuationToken token)
{
return _repo.GetAllByYear("2016", token) as FlorDataset;
}
调用我相当标准的Web API 2控制器的调用代码是:
do
{
try
{
HttpResponseMessage response = null;
if (string.IsNullOrEmpty(token.NextRowKey))
{
response = await client.GetAsync("api/list/None");
}
else
{
response = await client.GetAsync($"api/list/{token.NextRowKey}");
}
if (response.IsSuccessStatusCode)
{
var stringresponse = await response.Content.ReadAsStringAsync();
var ds = JsonConvert.DeserializeObject<FlorDataset>(stringresponse);
token = ds.Token;
Flors.AddRange(ds.Flors);
}
else
{
token = null;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
token = null;
}
} while (token != null);
好吧,这不是最好的解决方案,但这是迄今为止唯一有效的方法,以防其他人也在尝试同样的方法并无意中遇到我的问题。。。。
在调用代码位中,在进行取消序列化之前,您要进行一些可怕的字符串替换。。。。事实上,我只是发布这篇文章就觉得很恶心,所以如果有人能想出更好的答案,请随时分享。。。。。
if (response.IsSuccessStatusCode)
{
var stringresponse = await response.Content.ReadAsStringAsync();
stringresponse = stringresponse.Replace(">k__BackingField", "");
stringresponse = stringresponse.Replace("<", "");
var ds = JsonConvert.DeserializeObject<FlorDataset>(stringresponse);
token = ds.Token;
Flors.AddRange(ds.Flors);
}
不漂亮,不漂亮,但确实有效!!!:-D现在要用漂白剂洗手指了!!!