2016-07-19 3 views
0

У меня возникли проблемы с попыткой получить большие наборы данных от Azure TableStorage. После нескольких попыток попытаться получить его за один раз я отказался и теперь использую токен TableContinuation, который теперь не получает десериализован правильно. Объект создается, но все значения Next ... (т.е. NextRowKey, NextPartitionKey, и т.д., NULL, когда в stringresponse который создается вы можете увидеть значения следует населяющие с ...TableContinuationToken не получает Deserialised от JSON правильно

класс Я передаю содержит список объектов и лексему

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); 

ответ

0

Хорошо, это не самое большое решение, но это единственное, что работает до сих пор в случае, если кто-то пытается то же самое и спотыкаться по моему вопросу ....

В бит кода вызова вы делаете ужасный бит замены строки, прежде чем выполнять десериализацию .... Я действительно чувствую себя грязным, просто публикую это, так что, если кто-нибудь придумает лучший ответ, пожалуйста, не стесняйтесь делиться .....

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 Собираюсь мыть мои пальцы отбеливателем сейчас !!!

 Смежные вопросы

  • Нет связанных вопросов^_^