在C#.NET的Web响应不工作超过了几次(Web response in C# .NET does

2019-09-17 04:30发布

我正在开发使用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的常见问题 。

另外,我也等待一段时间,并得到了这个例外在2级: http://pastie.org/3897499

更新2:初听令人惊讶,但如果我跑提琴手,它完美的作品。 不管我是否针对此过程,也不会!

Answer 1:

  1. 请注意,您正在处理您的下非托管资源HttpWebResponse 。 因此调用Dispose()及时或在包装物using的语句不仅是明智的,但重要的是避免阻塞。
  2. 此外,VAR是伟大的处理匿名类型中的LINQ查询结果等,但它不应该成为一个拐杖。 为什么要使用VAR时,你也知道的类型? (即您已执行强制转换为HttpWebResponse )。
  3. 最后,像这样的服务往往限制每秒和/或允许以防止滥用的同时连接数的连接速率。 如果不配置您的HttpWebResponse对象,您可能会违反同时连接允许数量。 通过查询往往你会打破速度限制。


Answer 2:

你看到的效果几乎可以肯定是由于对Twitter的API(快速连续的多个请求),速率限制型政策。 他们让你如何使用他们的API严管:第一步是检查他们的使用条款和政策的限制速度 ,并确保您遵守是。

有两件事情我跳出:

  1. 你打的,在快速连续多个请求的API。 大多数REST API,包括谷歌搜索,都不会允许你这样做。 这些API是非常明显的目标,这是有道理的,他们会积极主动的有关防止拒绝服务攻击。
  2. 你不必在你的请求中指定一个用户代理 。 大多数API需要你给他们一个有意义的UA,为帮助他们找出你的方式。


文章来源: Web response in C# .NET doesn't work more than a couple of times