Azure Maps Batch 地理编码状态 202 12+ 小时后
Azure Maps Batch Geocoding Status 202 12+ Hours Later
我正在使用 RestSharp 以编程方式build/make/deserialize 调用 Azure Maps API 进行批量地理编码。目前正在用 5 个地址批次测试该过程——我希望在所有关于“几分钟内 10k 个地址”的帖子之后快速进行。但是我昨天成功的请求还是不可用,只显示documentation says means it's still processing...and there's no outage showing at the status page.
的"Accepted 202"状态
我已经使用 Postman 复制了这些调用和结果,所以我不确定代码本身是否存在问题...但这不是我第一次目光短浅而忽略了一些明显的东西。
我的 POST 调用是使用下面的代码生成的,并且 returns 具有必要位置的 OK 状态 header 看起来像一个有效的 link。
public RestRequest CreateBatchRequest()
{
var request = new RestRequest($"{_batchAddressEndpoint}subscription-key={_apiToken}", Method.POST);
request.AddQueryParameter("api-version", _version);
var batchRequestBody = GenerateQueryBatch();
var requestBodyJson = JsonConvert.SerializeObject(batchRequestBody);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("undefined", requestBodyJson, ParameterType.RequestBody);
return request;
}
protected AzureBatchRequest GenerateQueryBatch()
{
var requestBody = new AzureBatchRequest();
foreach (var address in Addresses)
{
var addressString = $"{address.Address}, {address.City}, {address.State}";
if (!string.IsNullOrEmpty(_country))
addressString = $"{address.Address}, {address.City}, {address.State}, {_country.ToUpper()}";
requestBody.Queries.Add($"?query={addressString}&limit={_resultLimit}");
}
return requestBody;
}
这为我的请求提供了一个 body 参数,该参数似乎与文档相匹配(出于隐私原因隐藏了实际地址,但它们已成功地通过其他服务进行了地理编码)...
{
undefined={"queries":[
"?query=123 MAIN ST, LOS ANGELES, CA&limit=3",
"?query=123 MAIN ST, PLEASANTVILLE, CA&limit=3",
"?query=123 MAIN ST, STOCKTON, CA&limit=3",
"?query=123 MAIN ST, SAN DIEGO, CA&limit=3",
"?query=123 MAIN ST, REDDING, CA&limit=3"
]}
}
我得到了 Location header 值,并使用下面的代码对其进行 GET 调用...
public List<Coordinate> DeserializeBatchResponse(RestResponse response)
{
var batchLink = response.Headers.Where(header => header.Name.Equals("Location")).FirstOrDefault();
var request = new RestRequest(batchLink.Value.ToString(), Method.GET);
var batch = SendRequest(request);
if (batch.StatusCode == System.Net.HttpStatusCode.Accepted)
{
var isProcessing = true;
while (isProcessing)
{
Thread.Sleep(TimeSpan.FromSeconds(60));
request = new RestRequest(batchLink.Value.ToString(), Method.GET);
batch = SendRequest(request);
if (batch.StatusCode != System.Net.HttpStatusCode.Accepted)
isProcessing = false;
}
}
}
而且它永远不会离开那个循环。当我对从昨天的 POST 请求返回的 URL 进行硬编码时,它具有相同的行为 - 与在 Postman 中尝试与我的其余代码隔离时的行为相同。
有没有人有任何见解?
更新
我们发现在更高层(S1 而不是 S0 层)创建新计划后,批处理调用没有明显延迟。从本质上讲,这仍然不是一个解决方案,因为出于生产目的,这使我们无法使用该产品,但可能是对其他人的修复,直到已接受的答案中提到的更新实现。
目前处于预览阶段,这是意料之中的事情。这将很快退出预览,并且速度会快得多。
我正在使用 RestSharp 以编程方式build/make/deserialize 调用 Azure Maps API 进行批量地理编码。目前正在用 5 个地址批次测试该过程——我希望在所有关于“几分钟内 10k 个地址”的帖子之后快速进行。但是我昨天成功的请求还是不可用,只显示documentation says means it's still processing...and there's no outage showing at the status page.
的"Accepted 202"状态我已经使用 Postman 复制了这些调用和结果,所以我不确定代码本身是否存在问题...但这不是我第一次目光短浅而忽略了一些明显的东西。
我的 POST 调用是使用下面的代码生成的,并且 returns 具有必要位置的 OK 状态 header 看起来像一个有效的 link。
public RestRequest CreateBatchRequest()
{
var request = new RestRequest($"{_batchAddressEndpoint}subscription-key={_apiToken}", Method.POST);
request.AddQueryParameter("api-version", _version);
var batchRequestBody = GenerateQueryBatch();
var requestBodyJson = JsonConvert.SerializeObject(batchRequestBody);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("undefined", requestBodyJson, ParameterType.RequestBody);
return request;
}
protected AzureBatchRequest GenerateQueryBatch()
{
var requestBody = new AzureBatchRequest();
foreach (var address in Addresses)
{
var addressString = $"{address.Address}, {address.City}, {address.State}";
if (!string.IsNullOrEmpty(_country))
addressString = $"{address.Address}, {address.City}, {address.State}, {_country.ToUpper()}";
requestBody.Queries.Add($"?query={addressString}&limit={_resultLimit}");
}
return requestBody;
}
这为我的请求提供了一个 body 参数,该参数似乎与文档相匹配(出于隐私原因隐藏了实际地址,但它们已成功地通过其他服务进行了地理编码)...
{
undefined={"queries":[
"?query=123 MAIN ST, LOS ANGELES, CA&limit=3",
"?query=123 MAIN ST, PLEASANTVILLE, CA&limit=3",
"?query=123 MAIN ST, STOCKTON, CA&limit=3",
"?query=123 MAIN ST, SAN DIEGO, CA&limit=3",
"?query=123 MAIN ST, REDDING, CA&limit=3"
]}
}
我得到了 Location header 值,并使用下面的代码对其进行 GET 调用...
public List<Coordinate> DeserializeBatchResponse(RestResponse response)
{
var batchLink = response.Headers.Where(header => header.Name.Equals("Location")).FirstOrDefault();
var request = new RestRequest(batchLink.Value.ToString(), Method.GET);
var batch = SendRequest(request);
if (batch.StatusCode == System.Net.HttpStatusCode.Accepted)
{
var isProcessing = true;
while (isProcessing)
{
Thread.Sleep(TimeSpan.FromSeconds(60));
request = new RestRequest(batchLink.Value.ToString(), Method.GET);
batch = SendRequest(request);
if (batch.StatusCode != System.Net.HttpStatusCode.Accepted)
isProcessing = false;
}
}
}
而且它永远不会离开那个循环。当我对从昨天的 POST 请求返回的 URL 进行硬编码时,它具有相同的行为 - 与在 Postman 中尝试与我的其余代码隔离时的行为相同。
有没有人有任何见解?
更新
我们发现在更高层(S1 而不是 S0 层)创建新计划后,批处理调用没有明显延迟。从本质上讲,这仍然不是一个解决方案,因为出于生产目的,这使我们无法使用该产品,但可能是对其他人的修复,直到已接受的答案中提到的更新实现。
目前处于预览阶段,这是意料之中的事情。这将很快退出预览,并且速度会快得多。