我正在使用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次,使用任何已评论的网址,包括谷歌搜索查询(我认为它可能是由于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:
我每15秒发送1个请求(在限制范围内),但仍然会导致错误。另一方面,发送请求,关闭应用程序并再次运行它非常有效(平均每5秒会有1个请求)。速率限制为每小时150个电话Twitter FAQ。
另外,我确实等了一会儿,并在第2级得到了这个例外: http://pastie.org/3897499
更新2: 可能听起来令人惊讶,但如果我运行提琴手,它的效果非常好。无论我是否以此过程为目标!
答案 0 :(得分:4)
您所看到的效果几乎肯定是由于Twitter API上的速率限制类型策略(快速连续的多个请求)。他们会密切关注您使用API的方式:第一步是检查terms of use上的rate limiting和政策,并确保您符合规定。
有两件事突然袭来我:
答案 1 :(得分:2)
HttpWebResponse
下的非托管资源。所以及时打电话给Dispose()
或者
将对象包装在using
语句中不仅是明智的,而且对于避免阻塞很重要。HttpWebResponse
。)