【问题标题】:Web response in C# .NET doesn't work more than a couple of timesC# .NET 中的 Web 响应不工作超过几次
【发布时间】:2012-05-11 22:34:25
【问题描述】:

我正在使用 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,包括 google 搜索查询(我认为它可能是由于 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: 听起来可能令人惊讶,但如果我运行 fiddler,它会完美运行。不管我是否针对这个过程!

【问题讨论】:

  • DisposeHttpWebResponse有什么变化吗?
  • 您需要 Dispose 响应。如果你不这样做,它会使连接保持打开状态。如果您与它们的打开连接过多,大多数服务器会阻止您。

标签: c# httpwebrequest httpwebresponse


【解决方案1】:

您看到的效果几乎可以肯定是由于 Twitter API 上的速率限制类型策略(快速连续的多个请求)。他们密切关注您如何使用他们的 API:第一步是检查他们的 terms of userate limiting 上的政策,并确保您遵守规定。

我突然想到了两件事:

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

【讨论】:

  • 我每 15 秒发送 1 个请求(在限制范围内),但它仍然会导致错误。另一方面,发送请求、关闭应用程序并再次运行它的效果非常好(平均每 5 秒有 1 个请求)。速率限制为每小时 150 次调用。
【解决方案2】:
  1. 请注意,您正在处理HttpWebResponse 下的非托管资源。所以请及时致电Dispose() 或 将对象包装在 using 语句中不仅明智,而且对于避免阻塞也很重要。
  2. 另外,var 非常适合处理匿名类型、Linq 查询 结果,等等,但它不应该成为拐杖。为什么要使用 var 当你很清楚类型? (即你已经在表演 转换为HttpWebResponse。)
  3. 最后,这样的服务通常会限制每秒的连接速率和/或允许的同时连接数,以防止滥用。如果不处理您的 HttpWebResponse 对象,您可能会违反允许的同时连接数。如果查询过于频繁,就会超出速率限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多