TableContinuationToken未正确从JSON进行反序列化



我在尝试从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现在要用漂白剂洗手指了!!!

相关内容

  • 没有找到相关文章

最新更新