WebResponse很慢

时间:2012-04-17 13:36:02

标签: c# api httpwebresponse

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

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

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

2 个答案:

答案 0 :(得分:2)

我担心你的服务运行速度不会超过imdb api查找的速度,加上你和imdb服务之间的带宽相关的一些开销,在调用时会增加微小的开销HttpWebRequest.GetResponse。

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

答案 1 :(得分: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服务)。