C#.NET中的Web响应不会运行多次

时间:2012-05-11 22:34:25

标签: c# httpwebrequest httpwebresponse

我正在使用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: 可能听起来令人惊讶,但如果我运行提琴手,它的效果非常好。无论我是否以此过程为目标!

2 个答案:

答案 0 :(得分:4)

您所看到的效果几乎肯定是由于Twitter API上的速率限制类型策略(快速连续的多个请求)。他们会密切关注您使用API​​的方式:第一步是检查terms of use上的rate limiting和政策,并确保您符合规定。

有两件事突然袭来我:

  1. 您正在快速连续多次请求API。大多数REST API(包括Google搜索)都不允许您这样做。这些API是非常明显的目标,有意义的是他们积极主动地防止拒绝服务攻击。
  2. 您的请求中未指定用户代理。大多数API要求您向他们发送有意义的UA,以帮助他们识别您的身份。

答案 1 :(得分:2)

  1. 请注意,您正在处理HttpWebResponse下的非托管资源。所以及时打电话给Dispose()或者 将对象包装在using语句中不仅是明智的,而且对于避免阻塞很重要。
  2. 此外,var非常适合处理匿名类型,Linq查询 结果,但不应该成为一个拐杖。为什么要使用var 当你很清楚这种类型的时候? (即你已经在表演了 施法者为HttpWebResponse。)
  3. 最后,像这样的服务通常会限制每秒的连接速率和/或允许防止滥用的同时连接数。通过不处理您的HttpWebResponse对象,您可能违反了允许的同时连接数。通过过于频繁的查询,你可以打破速率限制。