【发布时间】:2021-11-06 05:28:35
【问题描述】:
TLDR:我有一个功能正常的 C# 脚本,它调用 ESRI 地理编码服务。它传入地址,并取回 LAT/LON 数据。只要我在 URL 中嵌入地址,它就可以正常工作。我很难让类似的代码与调用正文中的地址内容一起运行。这里的目标是一次调用 500 多个地址的 REST 服务。
下面是一个脚本,只要我将地址作为 URL 的一部分嵌入,它就可以正常工作。它处理2-5个地址,没问题。但是(可以预见)——当尝试增加到 100 个地址时,我收到一个错误“无效的 URI:Uri 字符串太长。”
```C#
SqlDataAdapter geoA = new SqlDataAdapter(SQLStatement, GEOconn);
DataSet GeoDS = new DataSet();
geoA.Fill(GeoDS, "records");
var obj = JObject.FromObject(GeoDS);
obj["records"] = new JArray(obj["records"].Select(jo => new JObject(new JProperty("attributes", jo))));
string geoAJSON = obj.ToString();
geoAJSON = HttpUtility.UrlEncode(geoAJSON);
var con1 = "https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/geocodeAddresses?f=pjson&token=abc123&outFields=ResultID,Status,Score,Addr_type,ShortLabel,City,Subregion,RegionAbbr,Postal,PostalExt,Country,X,Y&addresses=";
var client = new RestClient(con1 + geoAJSON);
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Cookie", "AGS_ROLES=abc123");
IRestResponse response = client.Execute(request);
ESRIcls esri = JsonConvert.DeserializeObject<ESRIcls>(response.Content);
```
所以我试图利用 URL 请求的正文,并将所有地址推送到正文。到此为止我使用的脚本 sn-p 如下(上面稍作修改)。
SqlDataAdapter geoA = new SqlDataAdapter(SQLStatement, GEOconn);
DataSet GeoDS = new DataSet();
geoA.Fill(GeoDS, "records");
var obj = JObject.FromObject(GeoDS);
obj["records"] = new JArray(obj["records"].Select(jo => new JObject(new JProperty("attributes", jo))));
string geoAJSON = obj.ToString();
geoAJSON = HttpUtility.UrlEncode(geoAJSON);
var con1 = "https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/geocodeAddresses?f=pjson&token=abc123&outFields=ResultID,Status,Score,Addr_type,ShortLabel,City,Subregion,RegionAbbr,Postal,PostalExt,Country,X,Y";
var client = new RestClient(con1)
client.Timeout = -1
var request = new RestRequest(Method.POST);
request.AddJsonBody(geoAJSON);
//request.AddParameter("application/json", geoAJSON, ParameterType.RequestBody);
request.AddHeader("Cookie", "AGS_ROLES=abc123");
IRestResponse response = client.Execute(request);
ESRIcls esri = JsonConvert.DeserializeObject<ESRIcls>(response.Content);
在运行时,我在执行该 IRestResponse 行时遇到以下错误:
错误代码 400 extendedCode -2147467259 消息:无法完成 操作。
作为参考,这里是 geoAJSON 变量的内容。我尝试了多种 url 编码变体,但没有。不清楚我错了哪一部分,希望有任何建议。
"{\r\n \"records\": [\r\n {\r\n \"attributes\": {\r\n
\"OBJECTID\": 144,\r\n \"Address\": \"02483 BERRY RD\",\r\n
\"City\": \"CEDARTOWN\",\r\n \"Region\": \"GA\",\r\n
\"Postal\": \"30125\"\r\n }\r\n },\r\n {\r\n
\"attributes\": {\r\n \"OBJECTID\": 145,\r\n \"Address\":
\"0N321 SILVERLEAF BLVD\",\r\n \"City\": \"WHEATON\",\r\n
\"Region\": \"IL\",\r\n \"Postal\": \"60187-2913\"\r\n }\r\n
},\r\n {\r\n \"attributes\": {\r\n \"OBJECTID\": 146,\r\n
\"Address\": \"1\",\r\n \"City\": \"ROME\",\r\n
\"Region\": \"GA\",\r\n \"Postal\": \"30165\"\r\n }\r\n
}\r\n ]\r\n}"
【问题讨论】:
标签: c# json geocoding restsharp esri