0

私は、郵便番号と業種のリストを反復処理するアプリに取り組んでおり、それらのパラメーターに対して作成した URL を介して Google Places API (テキスト検索) への呼び出しを作成します。

URLは次のようになります

https://maps.googleapis.com/maps/api/place/textsearch/json?key=MY_API_KEY_HERE&sensor=false&query=57783+歯科医

以下の関数は、これらのリクエストごとに呼び出されます。

    private static StreamReader MakeWebRequest(string sURL)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sURL);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader objReader = new StreamReader(responseStream);
        return objReader;
    }

私が経験している問題は、3 ~ 5 回の繰り返しの後、応答オブジェクトがタイムアウトすることです (System.Net.WebException = "操作がタイムアウトしました")。私の最初の考えは、リクエストがすぐに送信されているということだったので、ループに Sleep(2000) を挿入しましたが、これは効果がないようです。失敗している URL を確認してブラウザに貼り付けたところ、適切なデータ返されました。

私が理解しているように、この API の呼び出しに対する唯一の制限は、未確認のアカウントで得られる 1 日あたりの 1000 です。私は何が欠けていますか?

編集:プログラムブロックの残りの部分は次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Web;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using GooglePlacesJSONGenerator.Models;

namespace GooglePlacesJSONGenerator
{
class Program
{
    static void Main(string[] args)
    {
        //set up a list of zips
        List<string> zipcodeList = new List<string>();
        zipcodeList.Add("57754");
        zipcodeList.Add("57783");
        zipcodeList.Add("57785");

        //setup a list of business types
        List<string> businessTypeList = new List<string>();
        businessTypeList.Add("restaurants");
        businessTypeList.Add("dentist");
        businessTypeList.Add("gym");

        //main data set
        GooglePlaceDataSet places = new GooglePlaceDataSet();

        //base url
        string urlBase = "https://maps.googleapis.com/maps/api/place/textsearch/json?key=MY_API_KEY_HERE&sensor=false&query=";
        string nextUrlBase = urlBase + "&pagetoken=";
        Stream objStream;
        //loop on zip codes
        foreach (string zip in zipcodeList)
        {
            Console.WriteLine("looping on zip " + zip);

            //loop on business type
            foreach (string type in businessTypeList)
            {
                Console.WriteLine("loop on type " + type);

                string sURL;
                string query = HttpUtility.UrlEncode(zip + " " + type);
                sURL = urlBase + query;
                Console.WriteLine("Query String: " + query);
                while (sURL != "")
                {

                    Console.WriteLine("Our URL:  " + sURL);
                    Console.WriteLine("");

                    StreamReader objReader = MakeWebRequest(sURL);

                    JsonTextReader reader = new JsonTextReader(objReader);

                    JsonSerializer se = new JsonSerializer();
                    string parsedData = se.Deserialize(reader).ToString();
                    GooglePlaceDataSet gSet = JsonConvert.DeserializeObject<GooglePlaceDataSet>(parsedData);

                    foreach (GooglePlaceData place in gSet.results)
                    {
                        places.results.Add(place);
                    }

                    if (gSet.next_page_token != null)
                        sURL = nextUrlBase + gSet.next_page_token;
                    else
                    sURL = "";

                    System.Threading.Thread.Sleep(2000);
                }
            }
        }
        Console.ReadLine();
    }
4

2 に答える 2

2

答えは「当たり前のことを忘れるな」でした。StreamReader オブジェクトを閉じる必要がありました。閉じると、上記のコードが機能しました。

于 2012-07-23T14:02:14.490 に答える
0

これは、サービス プロバイダーが許可する同じ送信元アドレスからの同時接続の最大数のしきい値に達した結果である可能性があります。using または try/finally を介して適切にリソースを Dispose() する必要があります。そうしないと、リソースがガベージ コレクターによって破棄されるまで、接続が開いたままになります。C# .NET での Web 応答が 2 回以上機能しないおよびC# https ログインとファイルのダウンロード を参照してください。これらには関連するコンテンツがあります。

于 2012-07-17T18:37:57.317 に答える