Spåra asynkrona Azure-åtgärder

Vissa Azure REST-åtgärder körs asynkront eftersom åtgärden inte kan slutföras snabbt. Den här artikeln beskriver hur du spårar status för asynkrona åtgärder via värden som returneras i svaret.

Statuskoder för asynkrona åtgärder

En asynkron åtgärd returnerar inledningsvis en HTTP-statuskod för något av följande:

  • 201 (skapad)
  • 202 (godkänd)

Den statuskoden betyder dock inte nödvändigtvis att åtgärden är asynkron. En asynkron åtgärd returnerar också ett värde för provisioningState som anger att åtgärden inte är klar. Värdet kan variera beroende på åtgärd men inkluderar inte Lyckades, Misslyckades eller Avbryts. Dessa tre värden anger att åtgärden har slutförts. Om inget värde returneras för provisioningStateslutförs och lyckades åtgärden.

När åtgärden har slutförts returneras antingen:

  • 200 (OK)
  • 204 (inget innehåll)

Se REST API-dokumentationen för att se svaren för den åtgärd som du kör.

När du har hämtat svarskoden 201 eller 202 är du redo att övervaka åtgärdens status.

URL för att övervaka status

Det finns två olika sätt att övervaka statusen för den asynkrona åtgärden. Du bestämmer rätt metod genom att undersöka huvudvärdena som returneras från din ursprungliga begäran. Leta först efter:

  • Azure-AsyncOperation – URL för att kontrollera den pågående statusen för åtgärden. Om åtgärden returnerar det här värdet använder du det för att spåra åtgärdens status.
  • Retry-After – Antalet sekunder att vänta innan du kontrollerar statusen för den asynkrona åtgärden.

Om Azure-AsyncOperation inte är ett av huvudvärdena letar du efter:

  • Location – URL för att avgöra när en åtgärd har slutförts. Använd endast det här värdet när Azure-AsyncOperation det inte returneras.
  • Retry-After – Antalet sekunder att vänta innan du kontrollerar statusen för den asynkrona åtgärden.

Retry-after När huvudet inte returneras implementerar du din egen logik för återförsök.

Kommentar

REST-klienten måste acceptera en minsta URL-storlek på 4 kB för Azure-AsyncOperation och Location.

Behörighet för att spåra asynkron status

Om du vill spåra status för en asynkron åtgärd behöver du tillräcklig behörighet på resursgruppens nivå. Om du bara har behörighet på resursnivå kan du starta åtgärden, men du kan inte spåra dess status. Behörighet på resursgruppens nivå krävs eftersom URL:en för spårningsstatus inte är begränsad till resursen.

Om du till exempel vill starta en virtuell dator behöver du rollen Virtuell datordeltagare för resursgruppen som innehåller den virtuella datorn. URL:en för att spåra en startbegäran innehåller inte den virtuella datorn i sökvägen.

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

Begäran och svar om Azure-AsyncOperation

Om du har en URL från Azure-AsyncOperation rubrikvärdet skickar du en GET-begäran till den URL:en. Använd värdet från Retry-After för att schemalägga hur ofta statusen ska kontrolleras. Du får ett svarsobjekt som anger status för åtgärden. Ett annat svar returneras när du kontrollerar status för åtgärden med Location URL:en. Mer information om svaret från en plats-URL finns i Skapa lagringskonto (202 med Plats och Försök igen).

Svarsegenskaperna kan variera men alltid innehålla status för den asynkrona åtgärden.

{
    "status": "{status-value}"
}

I följande exempel visas andra värden som kan returneras från åtgärden:

{
    "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}"
    }
}

Felobjektet returneras när statusen misslyckades eller avbröts. Alla andra värden är valfria. Svaret du får kan se annorlunda ut än exemplet.

provisioningState-värden

Åtgärder som skapar, uppdaterar eller tar bort (PUT, PATCH, DELETE) en resurs returnerar vanligtvis ett provisioningState värde. När en åtgärd är klar returneras något av följande tre värden:

  • Slutfördes
  • Misslyckades
  • Avbruten

Alla andra värden anger att åtgärden fortfarande körs. Resursprovidern kan returnera ett anpassat värde som anger dess tillstånd. Du får till exempel Accepterad när begäran tas emot och körs.

Exempel på begäranden och svar

Starta en virtuell dator (202 med Azure-AsyncOperation)

Det här exemplet visar hur du fastställer status för startåtgärden för virtuella datorer. Den första begäran är i följande format:

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

Den returnerar statuskod 202. Bland huvudvärdena ser du:

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

Om du vill kontrollera statusen för den asynkrona åtgärden skickar du en annan begäran till url:en.

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

Svarstexten innehåller status för åtgärden:

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

Distribuera resurser (201 med Azure-AsyncOperation)

Det här exemplet visar hur du fastställer status för distributionsåtgärden för distribution av resurser till Azure. Den första begäran är i följande format:

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

Den returnerar statuskod 201. I svarets brödtext ingår:

"provisioningState":"Accepted",

Bland huvudvärdena ser du:

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

Om du vill kontrollera status för den asynkrona åtgärden skickar du en annan begäran till url:en.

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

Svarstexten innehåller status för åtgärden:

{
    "status": "Running"
}

När distributionen är klar innehåller svaret:

{
    "status": "Succeeded"
}

Skapa lagringskonto (202 med Plats och Försök igen)

I det här exemplet visas hur du fastställer status för skapandeåtgärden för lagringskonton. Den första begäran är i följande format:

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

Och begärandetexten innehåller egenskaper för lagringskontot:

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

Den returnerar statuskod 202. Bland huvudvärdena visas följande två värden:

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

När du har väntat i antal sekunder som angetts i Försök igen kontrollerar du statusen för den asynkrona åtgärden genom att skicka en annan begäran till url:en.

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

Om begäran fortfarande körs får du statuskoden 202. Om begäran har slutförts får du statuskoden 200. Brödtexten i svaret innehåller egenskaperna för det lagringskonto som skapades.

Nästa steg