C# .NET 中的 Web 响应不会工作超过几次
本文关键字:几次 工作 中的 NET Web 响应 | 更新日期: 2023-09-27 18:34:06
我正在使用Twitter api开发一个应用程序,这涉及编写一个方法来检查用户是否存在。这是我的代码:
public static bool checkUserExists(string user)
{
//string URL = "https://twitter.com/" + user.Trim();
//string URL = "http://api.twitter.com/1/users/show.xml?screen_name=" + user.Trim();
//string URL = "http://google.com/#hl=en&sclient=psy-ab&q=" + user.Trim();
string URL = "http://api.twitter.com/1/users/show.json?screen_name=" + user.Trim();
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(URL);
try
{
var webResponse = (HttpWebResponse)webRequest.GetResponse();
return true;
}
//this part onwards does not matter
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
{
var resp = (HttpWebResponse)ex.Response;
if (resp.StatusCode == HttpStatusCode.NotFound)
{
return false;
}
else
{
throw new Exception("Unknown level 1 Exception", ex);
}
}
else
{
throw new Exception("Unknown level 2 Exception", ex);
}
}
}
问题是,调用该方法不起作用(它没有得到响应(超过 2 或 3 次,使用任何已注释的 URL,包括谷歌搜索查询(我认为这可能是由于 Twitter API 限制(。在调试时,它显示它卡在:
var webResponse = (HttpWebResponse)webRequest.GetResponse();
我是这样称呼它的:
Console.WriteLine(TwitterFollowers.checkUserExists("handle1"));
Console.WriteLine(TwitterFollowers.checkUserExists("handle2"));
Console.WriteLine(TwitterFollowers.checkUserExists("handle3"));
Console.WriteLine(TwitterFollowers.checkUserExists("handle4"));
Console.WriteLine(TwitterFollowers.checkUserExists("handle5"));
Console.WriteLine(TwitterFollowers.checkUserExists("handle6"));
我最多得到 2-3 行输出。有人可以指出出了什么问题吗?
更新 1:
我每 1 秒发送 15 个请求(完全在限制范围内(,但它仍然导致错误。另一方面,发送请求、关闭应用程序并再次运行它效果很好(平均每 1 秒帐户 5 个请求(。速率限制为每小时 150 次调用 Twitter 常见问题解答。
另外,我确实等了一段时间,并在级别 2 处得到了这个异常:http://pastie.org/3897499
更新 2:听起来可能令人惊讶,但如果我运行小提琴手,它会完美运行。不管我是否针对这个过程!
你所看到的效果几乎可以肯定是由于 Twitter API 上的速率限制类型策略(快速连续的多个请求(。 他们密切关注您如何使用他们的API:第一步是检查他们的使用条款和速率限制政策,并确保您合规。
有两件事突然出现在我面前:
- 您正在快速连续地使用多个请求访问 API。 大多数REST API,包括Google搜索,都不允许您这样做。 这些 API 是非常明显的目标,它们主动防止拒绝服务攻击是有道理的。
- 您的请求中未指定用户代理。 大多数 API 都要求您向他们发送有意义的 UA,以帮助他们识别您的身份。
- 请注意,您正在处理
HttpWebResponse
下的非托管资源。所以及时打电话给Dispose()
或将对象包装在using
语句中不仅是明智的,而且对于避免阻塞也很重要。 - 此外,var 非常适合处理匿名类型、Linq 查询结果,诸如此类,但它不应该成为拐杖。为什么使用 var当您非常了解类型时?(即您已经在执行演员表
HttpWebResponse
.( - 最后,像这样的服务通常会限制每秒的连接速率和/或允许的同时连接数,以防止滥用。如果不释放 HttpWebResponse 对象,可能会违反允许的同时连接数。如果查询过于频繁,则会违反速率限制。