我决定从 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 - 远程服务器返回错误:403 Forbidden Exception。
我想知道这是否与对该特定 XML 文件的访问权限的某种访问限制有关?
进一步研究和调整建议
如下所述,这绝不是最佳实践,但我已经包含了我现在用于异常的 catch。我在 Page_Load 上运行此代码,所以我只是回发到页面。从那以后我没有注意到任何问题。性能方面我并不过分担心 - 我没有注意到加载时间有任何增加,而且这个解决方案是暂时的,因为这都是为了测试目的。我仍在使用 Yahoo 的 Weather API。
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);
}
}
}
说明 API 错误处理的 Google 文章
谢谢:
https://stackoverflow.com/a/12011819/1302173(捕获 403 并召回)
https://stackoverflow.com/a/11883388/1302173(错误处理和一般 Google API 信息)
https://stackoverflow.com/a/12000806/1302173(响应处理/json缓存-未来计划)
选择
我最近发现了这个很棒的开源替代品