2017-02-07 2 views
0

У меня есть динамическая страница с файлом .JSON, и я использую мою программу C# для доступа к ней каждые х секунд, чтобы определить, было ли что-то изменено или нет. Все работает безупречно, пока у меня есть подключение к Интернету, если по какой-то причине я его теряю, тогда моя программа вылетает, поскольку ex.Response - это нуль. Мне было интересно, если есть лучший способ обработки следующего кода:Правильно обрабатывать WebRequests

void Function(){ 
while(true){ 
jList = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<jsonList>(GET(jsonUrl)); 
//SOME THINGS I DO with the data above here 

Thread.Sleep(5000); 
}} 



    string GET(string url) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     try 
     { 
      WebResponse response = request.GetResponse(); 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); 
       return reader.ReadToEnd(); 
      } 
     } 
     catch (WebException ex) 
     { 
      WebResponse errorResponse = ex.Response; 
      if (ex.Response != null) { 
      using (Stream responseStream = errorResponse.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); 
       String errorText = reader.ReadToEnd(); 
       // log errorText 
      } 
     } 
      throw; 
     } 
    } 

Возможно, я должен пинговать его первым, и посмотреть, если я получаю ответ, и только затем Выполнить WebRequest функции?

EDIT:

После добавления этого

public bool getResponse(string URL) 
     { 
      try 
      { 
       WebClient wc = new WebClient(); 
       string HTMLSource = wc.DownloadString(URL); 
       return true; 
      } 
      catch (Exception) 
      { 
       return false; 
      } 
     } 

И использовать его как

void Function(){ 
while(true){ 
     if (!getResponse(jsonUrl)) 
       { 
        return; 
       } 
jList = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<jsonList>(GET(jsonUrl)); 
//SOME THINGS I DO with the data above here 

Thread.Sleep(5000); 
}} 

Моя C# приложение ждет немного, а затем выходит нормально. Зачем?

Программа '[10476] Kiosk2.vshost.exe' вышла с кодом 0 (0x0).

+0

пинг не guaranteeed его ICMP, он имеет низкий приоритет в мире, во-вторых, даже если он сделал пинг, он не гарантирует веб-ответ .. Для ответ заключается в том, чтобы лучше обрабатывать вашу ошибку - вы, очевидно, не проверяете где-то ваши данные или ваша программа не будет разбита. – BugFinder

+0

В идеале я думаю, что он должен проверить, доступна ли страница, прежде чем пытаться прочитать данные из нее. Где-то в функции void Function() в цикле без конца. Я пробовал это, но до сих пор не существует bool RemoteWebOnline (string url) { Запрос WebRequest = WebRequest.Create (url); Ответ на запрос WebResponse; try { response = request.GetResponse(); Console.WriteLine («Ответ в сети:« + ответ »); return true; } catch { return false; } } –

ответ

0

Хорошо, это похоже на работу для меня.

public void Update() //CALLED IT void FUNCTION earlier 
     { 

      while (true) 
      { 
       while (getResponse(jsonUrl)) 
       { 


        jList = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<jsonList>(GET(jsonUrl)); 

//I DO SOME STUFF HERE 
//INTERESTING STUFF 


        Thread.Sleep(5000); 

       } 

      } 


     } 

И функция секунд:

public bool getResponse(string URL) 
    { 
     try 
     { 
      WebClient wc = new WebClient(); 
      string HTMLSource = wc.DownloadString(URL); 
      return true; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 
Смежные вопросы