0

我正在尝试使用 api 来获取有关电影的信息,我正在使用这个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);
    }
4

2 回答 2

2

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

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

于 2012-04-17T13:42:53.550 回答
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 个并发请求(有关详细信息,请参阅此帖子)。并且您应该仔细选择号码,以免违反使用条款(IMDB api服务,如果有的话)。

于 2012-04-17T15:02:07.350 回答