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