我正在开发一个应用程序来遍历邮政编码和业务类型列表,然后通过我为这些参数构建的网址创建对Google Places API(文本搜索)的调用。
网址看起来像这样
为每个请求调用以下函数:
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),但这似乎没有效果。我检查了失败的网址并将其粘贴到浏览器中,然后他们执行返回正确的数据。
根据我的理解,对这个api的呼叫的唯一限制是我每天使用未经验证的帐户获得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();
}
答案 0 :(得分:2)
答案是“不要忘记显而易见的事情。”需要关闭StreamReader对象。一旦我关闭它,上面的代码工作。
答案 1 :(得分:0)
这可能是针对服务提供商允许的同一源地址的最大同时连接数阈值运行的结果。您必须通过using或try / finally正确地Dispose()资源,否则连接将保持打开状态,直到资源由垃圾收集器处理。请参阅Web response in C# .NET doesn't work more than a couple of times和C# https login and download file,其中包含相关内容。