对于来自HTTPClient的所有请求,Weather.gov当前观察源突然开始失败,同样我发现互联网上许多使用AJAX来调用weather.gov的网站也都失败了。
对weather.gov当前观察馈送的所有调用的结果,例如http://w1.weather.gov/xml/current_obs/TAPA.xml,返回403.所述网址在浏览器中正确解析。
答案 0 :(得分:18)
联系weather.gov得到了非常快速的回应,其中包括:
在weather.gov上访问资源的应用程序现在需要提供一个 任何HTTP请求中的User-Agent标头。没有用户代理的请求 被自动阻止。我们已实施此使用政策 少数客户利用的资源远远超过了什么 大多数人会认为合理。
我们建议使用以下格式提供用户代理字符串:
ApplicationName / vX.Y(http://your.app.url/; contact.email@example.com)
这将唯一标识您的应用程序并允许我们 如果我们观察到异常申请,请与您联系并与您合作 可能导致阻止的行为。
如果您以后继续遇到问题,请随时给我们发电子邮件 验证您的应用程序是否正在发送正确的标题。
感谢您使用weather.gov。
=======
这是一段C#代码。关键是您需要创建请求对象,然后在进行调用之前向其附加自定义用户代理字符串。
...
var request = new HttpRequestMessage(HttpMethod.Post, httpClient.BaseAddress.AbsoluteUri);
request.Headers.Add("User-Agent", "MyApplication/v1.0 (http://foo.bar.baz; foo@bar.baz)");
var httpResponse = httpClient.SendAsync(request).Result;
...
希望这有助于人们。 干杯
答案 1 :(得分:2)
这很棒,但你不能设置" User-Agent"当你使用XMLDocument并调用Load()时(这曾经工作):
XmlDocument doc = new XmlDocument();
string stationName = @"http://w1.weather.gov/xml/current_obs/PASC.xml";
doc.Load(stationName); // exception 403 occurs here now
现在您需要执行GET,然后将User-Agent设置为您的公司或电子邮件,然后使用XmlDocument,如:
XmlDocument doc = new XmlDocument();
string stationName = @"http://w1.weather.gov/xml/current_obs/PASC.xml";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(stationName);
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = "MyApplication/v1.0 (http://foo.bar.baz; foo@bar.baz)";
request.Accept = "Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();
doc.Load(resStream);
try
{
XmlNodeList list = doc.GetElementsByTagName("temp_f");
if (list.Count > 0)
{
float fTemperature = float.Parse(list.Item(0).InnerText);
}
}
答案 2 :(得分:2)
关于您从Étude 12-1 Études for Elixir发现此问题的机会,这里有什么最终为我工作
s_url = "http://w1.weather.gov/xml/current_obs/" <> weather_station <> ".xml"
:httpc.request(:get, { to_char_list(s_url),
[ {'User-Agent','ErlangEtudes/v1.0 (http://example.org;me@example.org)' } ]
},[],[] )
答案 3 :(得分:1)
我遇到了同样的问题,但使用的是PowerShell。这是一种使用HttpWebRequest设置用户代理的方法。
$weather_url = "http://w1.weather.gov/xml/current_obs/KLNK.xml"
$request = [System.Net.HttpWebRequest]::Create($weather_url)
$request.UserAgent = " {Enter your agent} "
$response = $request.GetResponse()
$doc = New-Object System.Xml.XmlDocument
$doc.Load($response.GetResponseStream())
$temp_f = [int] $doc.current_observation.temp_f