Google Weather API 403 Ошибка [повторяется]
This question already has an answer here:
Google Weather API gone? 4 answersЯ решил получить информацию из Google Weather API - код, который я использую ниже, работает нормально.
XmlDocument widge = new XmlDocument();
widge.Load("https://www.google.com/ig/api?weather=Brisbane/dET7zIp38kGFSFJeOpWUZS3-");
var weathlist = widge.GetElementsByTagName("current_conditions");
foreach (XmlNode node in weathlist)
{
City.Text = ("Brisbane");
CurCond.Text = (node.SelectSingleNode("condition").Attributes["data"].Value);
Wimage.ImageUrl = ("http://www.google.com/" + node.SelectSingleNode("icon").Attributes["data"].Value);
Temp.Text = (node.SelectSingleNode("temp_c").Attributes["data"].Value + "°C");
}
}
Как я уже сказал, я могу извлечь необходимые данные из файла XML и отобразить их, однако, если страница обновляется или текущий сеанс все еще активен, я получаю следующую ошибку:
WebException was unhandled by user code - The remote server returned an error: 403 Forbidden Exception.
Мне интересно, может ли это быть связано с какими-то ограничениями доступа, налагаемыми на доступ к этому конкретному XML-файлу?
Further research and adaptation of suggestionsКак указано ниже, это ни в коем случае не лучшая практика, но я включил улов, который я сейчас использую, для исключения. Я запускаю этот код на Page_Load, поэтому просто делаю постбэк на страницу. С тех пор я не заметил никаких проблем. С точки зрения производительности я не слишком обеспокоен - я не заметил какого-либо увеличения времени загрузки, и это решение является временным, потому что это все для целей тестирования. Я все еще нахожусь в процессе использования Погодного API Yahoo.
try
{
XmlDocument widge = new XmlDocument();
widge.Load("https://www.google.com/ig/api?weather=Brisbane/dET7zIp38kGFSFJeOpWUZS3-");
var list2 = widge.GetElementsByTagName("current_conditions");
foreach (XmlNode node in list2)
{
City.Text = ("Brisbane");
CurCond.Text = (node.SelectSingleNode("condition").Attributes["data"].Value);
Wimage.ImageUrl = ("http://www.google.com/" + node.SelectSingleNode("icon").Attributes["data"].Value);
Temp.Text = (node.SelectSingleNode("temp_c").Attributes["data"].Value + "°C");
}
}
catch (WebException exp)
{
if (exp.Status == WebExceptionStatus.ProtocolError &&
exp.Response != null)
{
var webres = (HttpWebResponse)exp.Response;
if (webres.StatusCode == HttpStatusCode.Forbidden)
{
Response.Redirect(ithwidgedev.aspx);
}
}
}
Google article illustrating API error handling
Thanks to:
https://stackoverflow.com/a/12011819/1302173 (Поймать 403 и вспомнить)
https://stackoverflow.com/a/11883388/1302173 (Обработка ошибок и общая информация API Google)
https://stackoverflow.com/a/12000806/1302173 (Обработка ответов / кэширование JSON - планы на будущее)
AlternativeЯ нашел эту отличную альтернативу с открытым исходным кодом недавно