2012-04-17 5 views
0

Я пытаюсь использовать api для получения информации о фильмах, Я использую this api an it actualy works.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 для более подробной информации). И вы должны тщательно выбрать номер, чтобы не нарушать срок использования (службы IMIB IMI, если таковой имеется).

2

Боюсь, ваш сервис может работать не быстрее, чем скорость ИБМД API-запросы, а также некоторые накладные расходы в связи с пропускной способностью между вами и службой IMDB, плюш с крошечным над головой, призывая HttpWebRequest .GetResponse.

Возможно, единственный способ ускорить обслуживание - это разместить его в том же здании, что и imdb.

Смежные вопросы