Отслеживание асинхронных операций Сетки событий Azure

Некоторые операции REST выполняются в Azure асинхронно, поскольку не могут быть быстро завершены. Из этой статьи вы узнаете, как отслеживать состояние асинхронных операций, используя возвращаемые в ответе значения.

Коды состояния для асинхронных операций

Изначально асинхронная операция возвращает один из следующих кодов состояния HTTP:

  • 201 Создано
  • 202 (принято)

После успешного завершения операции возвращаются следующие коды:

  • 200 OK;
  • 204 No Content (нет содержимого).

Ответы по выполняемой операции описаны в разделе Документация по REST API.

Мониторинг состояния операции

Асинхронные операции REST возвращают значения заголовков, которые используются для определения состояния операции. Существует три значения заголовка для проверки:

  • Azure-AsyncOperation — это URL-адрес для проверки текущего состояния операции. Если операция возвращает это значение, всегда используйте его (вместо расположения) для отслеживания состояния операции.
  • Location — URL-адрес для определения завершения операции. Используйте это значение только в случае, если Azure-AsyncOperation не возвращается.
  • Retry-After — это количество секунд ожидания перед проверкой состояния асинхронной операции.

Однако не каждая асинхронная операция возвращает все эти значения. Например, может потребоваться оценить значение заголовка Azure-AsyncOperation для одной операции и значение заголовка Location для другой операции.

Вы извлекаете значения заголовка так же, как при извлечении любого другого значения заголовка для запроса. Например, в C#вы извлекаете значение заголовка HttpWebResponse из объекта с именем response следующего кода:

response.Headers.GetValues("Azure-AsyncOperation").GetValue(0)

Запрос и ответ с использованием Azure-AsyncOperation

Чтобы получить статус асинхронной операции, отправьте запрос GET на URL, указанный в значении заголовка Azure-AsyncOperation.

Содержимое результата этой операции содержит сведения об операции. В следующем примере показаны возможные значения, возвращаемые из операции:

{
    "id": "{resource path from GET operation}",
    "name": "{operation-id}", 
    "status" : "Succeeded | Failed | Canceled | {resource provider values}", 
    "startTime": "2017-01-06T20:56:36.002812+00:00",
    "endTime": "2017-01-06T20:56:56.002812+00:00",
    "percentComplete": {double between 0 and 100 },
    "properties": {
        /* Specific resource provider values for successful operations */
    },
    "error" : { 
        "code": "{error code}",  
        "message": "{error description}" 
    }
}

Возвращается только status для всех ответов. Объект ошибки возвращается в том случае, если операция находится в состоянии сбоя (Failed) или отмены (Canceled). Все остальные значения являются необязательными; Таким образом, полученный ответ может выглядеть не так, как в примере.

Значения состояния выделения ресурсов

Операции, которые создают, обновляют или удаляют ресурсы (PUT, PATCH, DELETE), обычно возвращают значение provisioningState. После завершения операции возвращается одно из следующих трех значений:

  • Succeeded
  • Неудача
  • Отменено

Любое другое значение означает, что операция еще выполняется. Поставщик ресурсов может возвращать настраиваемое значение, указывающее его состояние. Например, вы можете получить Принято, когда запрос получен и выполняется.

Примеры запросов и ответов

Запуск виртуальной машины (202 с Azure-AsyncOperation)

В этом примере показано, как определить состояние запуска для виртуальных машин. Исходный запрос имеет следующий формат:

POST 
https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Compute/virtualMachines/{vm-name}/start?api-version=2016-03-30

В ответ получен код состояния 202. Среди значений заголовка, вы видите:

Azure-AsyncOperation : https://management.azure.com/subscriptions/{subscription-id}/providers/Microsoft.Compute/locations/{region}/operations/{operation-id}?api-version=2016-03-30

Чтобы проверить состояние асинхронной операции, отправьте другой запрос на этот URL-адрес.

GET 
https://management.azure.com/subscriptions/{subscription-id}/providers/Microsoft.Compute/locations/{region}/operations/{operation-id}?api-version=2016-03-30

Текст ответа содержит состояние операции:

{
  "startTime": "2017-01-06T18:58:24.7596323+00:00",
  "status": "InProgress",
  "name": "9a062a88-e463-4697-bef2-fe039df73a02"
}

Развертывание ресурсов (201 с Azure-AsyncOperation)

В этом примере показано, как определить состояние операции развертывания для развертывания ресурсов в Azure. Исходный запрос имеет следующий формат:

PUT
https://management.azure.com/subscriptions/{subscription-id}/resourcegroups/{resource-group}/providers/microsoft.resources/deployments/{deployment-name}?api-version=2016-09-01

В ответ получен код состояния 201. Текст ответа включает следующие данные:

"provisioningState":"Accepted",

Среди значений в заголовке вы видите:

Azure-AsyncOperation: https://management.azure.com/subscriptions/{subscription-id}/resourcegroups/{resource-group}/providers/Microsoft.Resources/deployments/{deployment-name}/operationStatuses/{operation-id}?api-version=2016-09-01

Чтобы проверить состояние асинхронной операции, отправьте другой запрос на этот URL-адрес.

GET 
https://management.azure.com/subscriptions/{subscription-id}/resourcegroups/{resource-group}/providers/Microsoft.Resources/deployments/{deployment-name}/operationStatuses/{operation-id}?api-version=2016-09-01

Текст ответа содержит состояние операции:

{"status":"Running"}

После завершения развертывания возвращается ответ с такими данными:

{"status":"Succeeded"}

Создание учетной записи хранения (код 202, значения Location и Retry-After)

В этом примере показано, как определить состояние операции создания для учетных записей хранения. Исходный запрос имеет следующий формат:

PUT
https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-name}?api-version=2016-01-01

И текст запроса содержит свойства для учетной записи хранения:

{ "location": "South Central US", "properties": {}, "sku": { "name": "Standard_LRS" }, "kind": "Storage" }

В ответ получен код состояния 202. Среди значений заголовка вы увидите следующие два значения:

Location: https://management.azure.com/subscriptions/{subscription-id}/providers/Microsoft.Storage/operations/{operation-id}?monitor=true&api-version=2016-01-01
Retry-After: 17

После ожидания количества секунд, указанного в Retry-After, проверьте состояние асинхронной операции, отправив другой запрос в этот URL-адрес.

GET 
https://management.azure.com/subscriptions/{subscription-id}/providers/Microsoft.Storage/operations/{operation-id}?monitor=true&api-version=2016-01-01

Если запрос все еще выполняется, вы получите код состояния 202. Если запрос завершен, вы получите код состояния 200, а текст ответа содержит свойства созданной учетной записи хранения.

Дальнейшие действия