Я использую следующий код для загрузки текста (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.
Я мало знаю об Linux, но я бы начал с трассировки сети HTTP-трафика, чтобы убедиться, что все данные передаются с сервера для клиента. Это исключало бы проблему сетевого уровня низкого уровня в ящике Linux. – Christoph
Является ли длина контента неправильной? – TyCobb
Попытайтесь поймать его в действии: добавьте утверждение, чтобы убедиться, что все, что StreamReader вернется, заканчивается символом «}», чтобы вы знали, что это действительно JSON, который попал в парсер. Я вроде бы пари, что платформа правильная, а ошибка - ваша ... – usr