1

我正在使用 RestSharp 以编程方式构建/制作/反序列化对 Azure Maps API 的调用以进行批量地理编码。目前使用 5 个地址批次测试该过程——在所有关于“几分钟内 10k 个地址”的帖子之后,我预计会很快完成。但是我昨天成功提出的请求仍然不可用,仅显示文档所说的“已接受 202”状态意味着它仍在处理中......并且状态页面上没有显示中断。

我已经使用 Postman 复制了这些调用和结果,所以我不确定是否存在代码问题……但这不是我第一次获得隧道视野并忽略了一些明显的事情。

我的 POST 调用是使用下面的代码生成的,并返回一个 OK 状态,其中包含必要的 Location 标头,看起来像是一个有效的链接。

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;
}

这为我提供了一个似乎与文档匹配的请求的正文参数(出于隐私原因隐藏了实际地址,但它们已成功使用其他服务进行地理编码)......

{
    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 标头值并使用下面的代码使用它进行 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 层)创建新计划后,批处理调用没有明显延迟。本身仍然不是解决方案,因为这会使我们出于生产目的而放弃产品,但可能是对其他人的修复,直到接受的答案中提到的更新取得成果。

4

1 回答 1

0

这在预览中是可以预料的。这将很快退出预览版,并且速度会明显加快。

于 2018-12-19T19:43:58.640 回答