【问题标题】:Getting System.Net.WebException: The remote server returned an error: (403) Forbidden. in Google URL Shortener API Call获取 System.Net.WebException:远程服务器返回错误:(403)禁止。在 Google URL Shortener API 调用中
【发布时间】:2012-10-01 07:46:09
【问题描述】:

我正在使用下面的代码来缩短长网址

public static string UrlShorten(string url)
{
    string post = "{\"longUrl\": \"" + url + "\"}";
    string shortUrl = url;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.googleapis.com/urlshortener/v1/url?key=" + ReadConfig("GoogleUrlShortnerApiKey"));
    try
    {
        request.ServicePoint.Expect100Continue = false;
        request.Method = "POST";
        request.ContentLength = post.Length;
        request.ContentType = "application/json";
        request.Headers.Add("Cache-Control", "no-cache");

        using (Stream requestStream = request.GetRequestStream())
        {
            byte[] postBuffer = Encoding.ASCII.GetBytes(post);
            requestStream.Write(postBuffer, 0, postBuffer.Length);
        }

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            using (Stream responseStream = response.GetResponseStream())
            {
                using (StreamReader responseReader = new StreamReader(responseStream))
                {
                    string json = responseReader.ReadToEnd();
                    shortUrl = Regex.Match(json, @"""id"": ?""(?<id>.+)""").Groups["id"].Value;
                }
            }
        }
    }
    catch (Exception ex)
    {
        // if Google's URL Shortner is down...
        Utility.LogSave("UrlShorten", "Google's URL Shortner is down", url, ex.ToString());
        //System.Diagnostics.Debug.WriteLine(ex.Message);
        //System.Diagnostics.Debug.WriteLine(ex.StackTrace);
    }
    return shortUrl;
}

我创建了一个调度程序来缩短大量 url。而且大部分时间都低于异常

System.Net.WebException:远程服务器返回错误:(403)禁止。在 System.Net.HttpWebRequest.GetResponse()

我在想,由于礼貌限制,我得到了这个例外,因此将每用户限制增加了 100,000.0 个请求/秒/用户,但我仍然得到同样的例外。

即使我一次向服务器发出几乎 2000 个请求,我也不明白为什么会发生这种情况。

请指教。

【问题讨论】:

  • 你能看到整个 json 响应是什么吗?不仅是状态码。
  • 它在“使用(HttpWebResponse response = (HttpWebResponse)request.GetResponse())”处抛出异常,完整的执行是“System.Net.WebException:远程服务器返回错误:(403 ) Forbidden. at System.Net.HttpWebRequest.GetResponse() at BusinessLogic.Utility.UrlShorten(String url) in D:\Dotnet Projects\FutureZoom\FutureZoom\BusinessLogic\Utility.cs:line 140"

标签: c# google-api google-url-shortener


【解决方案1】:

查看您的问题,我认为这是一个超出速率限制的错误。如果您像这样修改代码,则可以检索错误响应:

try
{
  ........
}
catch (WebException exception)
{
   string responseText;

   using(var reader = new StreamReader(exception.Response.GetResponseStream()))
   {
     responseText = reader.ReadToEnd();
   }
}
catch (Exception ex)
{
  ......
}

如果是速率限制超出错误,您会在 responseText 中找到类似的内容:

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "rateLimitExceeded",
    "message": "Rate Limit Exceeded"
   }
  ],
  "code": 403,
  "message": "Rate Limit Exceeded"
 }
}

【讨论】:

  • 是的,我得到了完全相同的响应。但是为什么它来了,即使我将每用户限制增加了 100,000.0 个请求/秒/用户,而礼貌限制是 1,000,000 个请求/天
  • 我猜不出它到底是什么,但也许你每秒做的请求太多了?否则,请尝试联系 Google。
  • 我的总请求少于2000。
  • 是否需要时间来反映礼貌限制?
  • 可能是这样,你的仪表板说什么? code.google.com/apis/console
【解决方案2】:

发生此错误是因为您将数据发布到网络服务的速度非常快,因此谷歌将其检测为机器人。(如果您经常手动发布数据,它会要求输入验证码)。

所以要解决这个问题,你需要增加每个发布请求之间的时间间隔。

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多