2013-04-12 4 views
1

Мне нужно отправить большой массив байтов в качестве ответа службы REST на запрос ajax. Я создаю список как:Получение неправильного ответа json в ajax-запросе

List<List<Byte>> list = new List<List<byte>>(); 

здесь, внутренний список будет иметь по 1000 байт каждый. Это код:

int cnt = 0; 
List<Byte> innerList = new List<Byte>(); 

for (int i = 0; i < fileBytes.Length; i++) 
{ 
    if (cnt < 1000) 
    { 
     Byte b = fileBytes[i]; 
     innerList.Add(b); 
     cnt++; 
     if (i == fileBytes.Length - 1) 
     { 
      list.Add(innerList); 
         log.Debug("Remaining:"); 
         log.Debug("List: " + list.Count); 
         log.Debug("innerList: " + innerList.Count); 
     } 
    } 
    else 
    { 
     list.Add(innerList); 
       log.Debug("Remaining:"); 
       log.Debug("List: " + list.Count); 
       log.Debug("innerList: " + innerList.Count); 
     innerList.Clear(); 
     cnt = 0; 
    } 
} 

return list; 

Сейчас, по словам log, у меня есть общие кол list как 503, с первым подсчетом 502, имеющими 1000 каждый (это будет innerList) в 503'th &, список ребенка содержит 54 байт.

Это мой запрос Ajax:

$.ajax({ 
       type: "GET", 
       dataType: "jsonp", 
       contentType: "jsonp", 
       data: dd, 
       crossDomain: true, 
       jsonp: "callback", 
       url: "http://xxx.xxx.xxx.xx/MyWebService/WebService.svc/MyMethod", 
       success: function (data) { 
        console.log(data); 
       }, 
       complete: function (request, textStatus) { //for additional info 
        alert(request.responseText); 
        alert(textStatus); 
       }, 
       error: function(request, textStatus, errorThrown) { 
        alert(textStatus); 
        } 
      }); 

Запрос будет завершена успешно, но в firebug я заметил, что я получаю data в success в коллекции 503 jsons каждый из которых имеет ключи 54 (!). Я думаю, что я должен был получить 1000 ключей в первых 502 jsons в data & только в 503-м я мог получить 54 ключа. Я что-то пропустил?

ответ

2

Поскольку вы используете тот же экземпляр innerList, длина которого составляет 54 байта. Попробуйте создать новые экземпляры.

Например, вместо innerList.Clear();, попробуйте innerList = new List<Byte>();


EDIT

Поскольку вы передаете содержимое файла как JSON, я предполагаю, что производительность не является вашей главной заботой. Если это так, вы можете использовать нижний Linq (с побочными эффектами), который короче и менее подвержен ошибкам

int cnt = 0; 
List<List<byte>> chunks = fileBytes 
          .GroupBy(x => cnt++/1000) 
          .Select(x => x.ToList()) 
          .ToList(); 
Смежные вопросы