【问题标题】:WebResponse slow网页响应慢
【发布时间】:2012-04-17 23:02:07
【问题描述】:

我正在尝试使用 api 来获取有关电影的信息, 我正在使用this api,它确实有效。

唯一的事情就是放慢速度,我想知道是否有更快的方法来做到这一点?我必须说,这对我来说是相当新的。这是一些代码。

    public string Connect()
    {
        WebRequest request = WebRequest.Create(this.url);
        request.ContentType = "application/json; charset=utf-8";

        //this is slowing me down
        WebResponse response = (HttpWebResponse)request.GetResponse();

        using (StreamReader sr = new StreamReader(response.GetResponseStream()))
        {
            jsonString = sr.ReadToEnd();
        }
        return jsonString;
    }

    public static string GetFilmInfo(string titel)
    {
        MakeCon checkVat = new MakeCon("http://www.imdbapi.com/?i=&t=red" + titel + "/");
        JsonSerializer serializer = new JsonSerializer();
        string jsonString = checkVat.Connect();
        return JsonConvert.DeserializeObject<string>(jsonString);
    }

【问题讨论】:

    标签: c# api httpwebresponse


    【解决方案1】:

    恐怕您的服务的运行速度不会比 imdb api 查找的速度快,再加上与您和 imdb 服务之间的带宽相关的一些开销,以及调用时的微小开销HttpWebRequest.GetResponse。

    可能加快服务速度的唯一方法是将其托管在与 imdb 相同的建筑物中。

    【讨论】:

      【解决方案2】:

      最好的办法是同时运行多个请求,使用 WebRequest.GetResponse 调用的异步版本,即 WebRequest.BeginGetResponse/EndGetResponse。这是一个简单的例子:

          static void Main(string[] args)
          {
              RequestByTitle("Mission Impossible");
              RequestByTitle("Mission Impossible 2");
              RequestByTitle("Mission Impossible 3");
              RequestByTitle("The Shawshank Redemption");
      
              Console.ReadLine();
          }
      
          private const String IMDBApiUrlFormatByTitle =
              "http://www.imdbapi.com/?t={0}";
      
          private static void RequestByTitle(String title)
          {
              String url = String.Format(IMDBApiUrlFormatByTitle, title);
              MakeRequest(url);
          }
      
          private static void MakeRequest(String url)
          {
              HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
              req.ServicePoint.ConnectionLimit = 10;
      
              req.BeginGetResponse(GetResponseCallback, req);
          }
      
          private static void GetResponseCallback(IAsyncResult ar)
          {
              HttpWebRequest req = ar.AsyncState as HttpWebRequest;
              String result;
              using (WebResponse resp = req.EndGetResponse(ar))
              {
                  using (StreamReader reader = new StreamReader(
                      resp.GetResponseStream())
                      )
                  {
                      result = reader.ReadToEnd();
                  }
              }
      
              Console.WriteLine(result);
          }
      

      注意这一行:

      req.ServicePoint.ConnectionLimit = 10;
      

      它允许您向同一个服务端点发出超过 2 个并发请求(有关详细信息,请参阅this post)。并且您应该谨慎选择号码,以免违反(IMDB api 服务的,如果有的话)的使用期限。

      【讨论】:

        猜你喜欢
        • 2016-05-10
        • 2021-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多