2016-11-29 4 views
0

Я нахожу URL-адрес, который возвращает длинный набор JSON (ДЕЙСТВИТЕЛЬНО длинный, 20 миллионов символов). Просто вставляя URL-адрес в Chrome, для возврата полного набора результатов требуется около 3 минут. Какими бы ни были настройки по умолчанию в Chrome, он несколько раз запрашивает у меня либо «Убить страницу», либо «Подождите». Но страница вернется через несколько минут.Почему мой веб-запрос C# не возвращает ничего?

Я запускаю это из SSIS с задачей скрипта. Я не очень хорошо знаком с C#. Я скопировать/вставить этот код из образца:

{ 

    HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(wUrl); 
    httpWReq.Method = "GET"; 
    httpWReq.ContentType = "application/json"; 
    httpWReq.Timeout = 300000; 
    HttpWebResponse httpWResp = (HttpWebResponse)httpWReq.GetResponse(); 
    RootObject jsonResponse = null; 

    try 
    { 
     //Get the stream of JSON 
     Stream responseStream = httpWResp.GetResponseStream(); 

     //Deserialize the JSON stream 
     using (StreamReader reader = new StreamReader(responseStream)) 
     { 
      //Deserialize our JSON 
      DataContractJsonSerializer sr = new DataContractJsonSerializer(typeof(RootObject)); 
      jsonResponse = (RootObject)sr.ReadObject(responseStream); 
     } 
    } 
    //Output JSON parsing error 
    catch (Exception e) 
    { 
     FailComponent(e.ToString()); 
    } 
    return jsonResponse; 

Я 110% уверен, что строка wURL является допустимым JSON конечной точки. Когда я пошагово моего кода, он ждет, может быть, 15 секунд на этой линии:

HttpWebResponse httpWResp = (HttpWebResponse)httpWReq.GetResponse(); 

... и затем возвращается без ошибок ... но это не заселить то, что я ожидал бы в httpWResp (ContentLength = -1). Когда он достигает:

jsonResponse = (RootObject)sr.ReadObject(responseStream); 

... jsonResponse содержит мой предварительно определенный контейнерный объект json, установленный в null. Из моего URL-адреса возвращаются тысячи json-массивов.

Я не вижу никаких интересных атрибутов в responseStream, которые указывали бы, что на самом деле он содержит что-нибудь?

Что мне здесь не хватает?

Я не могу опубликовать фактический URL, потому что это URL частной компании.

=================================

EDIT: Я попробовал URL с гораздо более короткая строка, и она вернулась. Таким образом, это похоже на длину. Я запустил возвращаемое значение через валидатор, и он преуспел ... возможно, особый персонаж, но я думаю, что это длина.

+1

пут попробовать поймать вокруг вашего кода и увидеть, что исключение он бросает, если таковые имеются. try {Your Code here} catch (WebException ex) {// catch web exception} catch (Exception ex) {// Любое другое исключение} – Hakunamatata

+0

какая версия сервера .net/sql вы используете? Библиотека HttpWebRequest претерпела довольно много изменений за последние несколько лет – AllMadHare

+0

@AllMadHare, я использую .NET Framework v 4.6.1 с SSIS VS 2015, указав на SQL Server 2012. Я не думаю, что SQL Server должен что-то с этим связано, так как я еще не добавил какие-либо компоненты SQL Server в свой пакет? Я добавил блок try/catch. Это не исключение. Возможно ли, что ответ слишком длинный для получения ...? – Quicksilver

ответ

1

Из комментариев мы теперь знаем, что объект ответа вы получите обратно из GetResponse() имеет StatusCode из OK и ContentType из приложения/JSON, кодировка = UTF-8 - указывает, что сервер возвратил данные «chunked», поэтому ContentLength = -1.

Вы должны быть в состоянии использовать метод ReadToEnd() на StreamReader, что-то вроде этого:

//Deserialize the JSON stream 
using (StreamReader reader = new StreamReader(responseStream)) 
    { 
     string r = reader.ReadToEnd(); 

     //Deserialize our JSON 
     DataContractJsonSerializer sr = new DataContractJsonSerializer(typeof(RootObject)); 
     MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(r)); 
     jsonResponse = (RootObject)sr.ReadObject(ms); 
} 
+0

Сначала я попробовал что-то подобное, и это не сработало, поэтому я попытался избежать использования строки. Это, по-видимому, другая ошибка. Я получаю: «{« Ожидающий элемент «root» из пространства имен ».« Encountered «None» с именем «», namespace ''. "} \t System.Exception {System.Runtime.Serialization.SerializationException} ' ... который для моего неопытного глаза, похоже, может быть, этот JSON не содержит ожидаемых стартовых узлов? – Quicksilver

+0

Можете ли вы получить всю строку ответа без ошибок? Если это будет выполнено нормально, вы можете попытаться решить любые проблемы с сериализацией. Есть ли способ для вас придумать тест с гораздо меньшим ответом, чтобы вы могли проверить подход к сериализации? –

+0

Я не думаю, что могу получить всю строку ответа, так как я получаю ошибку выше, когда я использую атрибут ReadToEnd. Я увидел еще одну ссылку, в которой говорилось, что ошибка, которую я опубликовал выше, означает, что поток нужно переместить в позицию 0, но когда я это пробовал, я получил сообщение об ошибке, что поток не поддерживает операции поиска. Я немного озадачен тем, почему это так сложно, поскольку это, по-видимому, очень стандартный подход к вытаскиванию JSON. Ну что ж. – Quicksilver

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