【问题标题】:Problem with Httpwebrequest (503)Httpwebrequest 问题 (503)
【发布时间】:2011-06-19 21:00:06
【问题描述】:

我正在使用HttpWebrequest 从 google 获取结果。我使用代理来获取数据。现在有一个奇怪的问题,对于某些查询它会返回数据,而对于某些查询它会抛出异常 The remote server returned an error: (503) Server Unavailable.。有人可能认为代理不好,但是当你把它放在 Internet Explorer 中然后你打开谷歌它就在那里。没有 503 错误。但是httpwebrequest 在某些查询上给出它。即如果你打算得到 ​​p>

http://www.google.com/search?q=site:http://www.yahoo.com 

它会抛出异常

http://www.google.com/search?q=info:http://www.yahoo.com

它有效。

到目前为止我的代码是

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(file);
                request.ProtocolVersion = HttpVersion.Version11;
                request.Method = "GET";
               request.KeepAlive = false;
                request.ContentType = "text/html";
                request.Timeout = 1000000000;
                request.ReadWriteTimeout = 1000000000;
                request.UseDefaultCredentials = true;
                request.Credentials = CredentialCache.DefaultCredentials;
    Uri newUri = new Uri("http://" + proxy[selectedProxy].ProxyAddress.Trim() + "/");
                    WebProxy myProxy = new WebProxy();
                    myProxy.Credentials = CredentialCache.DefaultCredentials;
                    myProxy.Address = newUri;
                    request.Proxy = myProxy;
 WebResponse response = request.GetResponse();
                    // System.Threading.Thread.Sleep(Delay);
                    StreamReader reader = null;
                    string data = null;
                    reader = new StreamReader(response.GetResponseStream());
                        data = reader.ReadToEnd();

【问题讨论】:

    标签: c# winforms httpwebrequest webexception


    【解决方案1】:

    您收到“对不起,您是垃圾邮件”消息,需要输入验证码才能继续或更改代理。由于某些原因,当您收到 503 错误时,默认情况下您无法提取页面内容,尽管如果您在浏览器中执行相同操作,内容将显示给您。

    【讨论】:

      【解决方案2】:

      这很奇怪。也许是一些 url 编码问题。尝试以下应该可以妥善处理所有事情的方法:

      using System;
      using System.Net;
      using System.Web;
      
      class Program
      {
          static void Main()
          {
              using (var client = new WebClient())
              {
                  var newUri = new Uri("http://proxy.foo.com/");
                  var myProxy = new WebProxy();
                  myProxy.Credentials = CredentialCache.DefaultCredentials;
                  myProxy.Address = newUri;
                  client.Proxy = myProxy;
      
                  var query = HttpUtility.ParseQueryString(string.Empty);
                  query["q"] = "info:http://www.yahoo.com";
                  var url = new UriBuilder("http://www.google.com/search");
                  url.Query = query.ToString();
                  Console.WriteLine(client.DownloadString(url.ToString()));
              }
          }
      }
      

      【讨论】:

      • HttpUtility 不可见它是一个winform应用程序
      • @Lagrangian,添加对System.Web 的引用,如果这是一个 .NET 4.0 客户端配置文件,只需使用完整框架配置文件在单独的应用程序中对其进行测试。我很想知道结果。如果这可行,则可以将类似的技术用于客户端配置文件。
      • 同样的异常。我不知道为什么,但是如果你用站点替换查询中的信息,它就不起作用。并且使用信息它的结果与我的方法相同,所以我认为编码不是问题
      • @Lagrangian,是的,似乎您使用了一些糟糕的代理,因为这两个示例在我的机器上都可以在没有代理的情况下正常工作。您从代理获得的 503 错误页面的内容是什么?它是否提供了有关失败原因的更多详细信息?
      • 我也尝试在没有代理的情况下在我的系统上工作,但是 Internet Explorer 是如何做到的?
      【解决方案3】:

      这取决于您使用相同 IP 地址向 Google 发送查询的频率。如果您向 Google 发送查询的速度过快,那么 Google 会阻止您的 IP 地址。发生这种情况时,Google 会返回一个 503 错误并重定向到他们的抱歉页面。

      做这样的事情:

      try
                  {
                      response = (HttpWebResponse) webRequest.GetResponse();
                  }
                  catch (WebException ex)
                  {
                      using (var sr = new StreamReader(ex.Response.GetResponseStream()))
                      {
                          var html = sr.ReadToEnd();
                      }
                  }
      

      调试时,检查 html 变量中的值。您会看到这是一个 HTML 页面,您应该在其中填写验证码

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多