2012-04-17 79 views
0

我正在尝试使用api来获取有关电影的信息, 我正在使用this api它实际的作品。WebResponse slow

唯一的办法就是减速,我想知道是否有更快的方法来做到这一点?我必须说,这对我来说是比较新的。这是索姆代码。

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); 
    } 

回答

0

您可以做的最好的做法是同时运行多个请求,即使用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服务,如果有的话)。

2

恐怕你的服务可以比IMDB API查询的运行速度不快,再加上有关你和IMDB服务之间的带宽一定的开销,在调用HttpWebRequest的毛绒一个微小开销.GetResponse。

也许你可以加快你的服务的唯一方法是将它托管在与imdb相同的建筑物中。