2015-01-13 2 views
2

Я использую следующий код для загрузки текста (JSON):Почему mono иногда урезает загрузки HTTP?

var request = WebRequest.Create(url); 
using (var response = request.GetResponse()) 
{ 
    string charset = null; 
    var httpResponse = response as HttpWebResponse; 
    if (httpResponse != null) 
    { 
     if (httpResponse.StatusCode != HttpStatusCode.OK) 
     { 
      throw new System.Net.WebException("Ststus code was: " + httpResponse.StatusCode); 
     } 
     charset = httpResponse.CharacterSet; 
    } 
    Encoding enc = charset != null ? Encoding.GetEncoding(charset) : null; 
    using (var reader = new StreamReader(response.GetResponseStream(), enc, true)) 
    { 
     return reader.ReadToEnd(); 
    } 
} 

В Windows (.NET) он работает отлично. В Linux (Mono runtime) он иногда возвращает усеченные данные: синтаксический анализатор json, потому что не может найти разделитель закрытия для строк и подобных ошибок. Это не проблема с парсером: я пробовал 2 разных. Это не похоже на проблему с кодировкой, потому что она иногда работает, а иногда и не для тех же загруженных данных.

Почему mono ведет себя так и как я могу избежать этой проблемы?

Редактировать: я добавил консольную печать для отладки. Строка, поступающая непосредственно из приведенного выше кода, окончательно усечена.

Edit2: Вот как я использую результат:

string json = DownloadTextFile(url); 
dynamic obj = Json.Decode(json);//Decoding fails here, because string is truncated. 
+0

Я мало знаю об Linux, но я бы начал с трассировки сети HTTP-трафика, чтобы убедиться, что все данные передаются с сервера для клиента. Это исключало бы проблему сетевого уровня низкого уровня в ящике Linux. – Christoph

+0

Является ли длина контента неправильной? – TyCobb

+0

Попытайтесь поймать его в действии: добавьте утверждение, чтобы убедиться, что все, что StreamReader вернется, заканчивается символом «}», чтобы вы знали, что это действительно JSON, который попал в парсер. Я вроде бы пари, что платформа правильная, а ошибка - ваша ... – usr

ответ

0

Проблема возникает гораздо реже, когда я пустите программу на сервере с хорошим очень хорошим подключением к сети. (После нескольких тысяч загрузок, а не после нескольких сотен). Это достаточно хорошо для моих целей.

Проверка длины содержимого не очень помогает, потому что это чаще всего -1. Печально, что сетевые материалы реализованы так слабо в моно. (В .net тот же код работает безупречно даже при плохом соединении.)

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