c# - C# .NET 中的 Web 响应最多只能运行几次

标签 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: 可能听起来令人惊讶,但如果我运行 fiddler,它会完美地工作。不管我是否针对这个过程!

最佳答案

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

有两件事引起了我的注意:

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

关于c# - C# .NET 中的 Web 响应最多只能运行几次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10559430/

相关文章:

c# - 无法获取 Openssl 签名数据以匹配 .NET 签名数据或 BouncyCaSTLe 签名数据

.net - .NET HttpWebRequest 中的压缩( header )错误?

powershell - 通过 HTTP 上传大文件

c# - 如果 C# async/await 仍然等待上一次执行完成,它有什么好处?

c# - 如果没有为 AlertDialog 分配资源 ID,它是否会有资源 ID?

c# - 将 cookie 从 CookieContainer 写入 IE cookie 存储

c# - HttpWebResponse.ReadTimeout - 不支持超时?

c# - WebRequest 获取没有异常的页面?

c# - 在 Android Xamarin mono 3.2.6 中递归解压文件夹

c# - 代理 HTTP 请求