SharePoint GetMigrationJobProgress API

Depois de enviar um trabalho de migração, seja um trabalho de importação ou um trabalho de AMR (Leitura de Metadados Assíncronos), você pode usar a API GetMigrationJobProgress para acompanhar seu progresso. A API está disponível por meio de interfaces SDK e REST.

Ele retorna uma sequência de eventos de status do trabalho, incluindo: JobQueued, JobStart, JobProgress, JobError e JobEnd.

Permissões

Use a autenticação baseada em aplicativo ao enviar um trabalho de migração. Certifique-se de que o aplicativo receba a permissão Sites.Read.All ou superior.

Método GetMigrationJobProgress (SDK)

Sintaxe

public ClientResult Site.GetMigrationJobProgress(
  Guid jobId, 
  String nextToken
)

Parâmetros do método

Nome Tipo Obrigatório Descrição
jobId Guid Sim Identificador exclusivo do trabalho de migração
nextToken Cadeia de caracteres Sim Token para posição de paginação. Use "0" para solicitação inicial

Para um trabalho concluído, as solicitações que usam nextToken são idempotentes — repetir a mesma solicitação retornará consistentemente o mesmo resultado.

Return Values

Nome Tipo Descrição
Logs ILista Retorna uma coleção de eventos de status do trabalho quando um novo progresso está disponível ou uma coleção vazia se não houver atualizações.
NextToken Cadeia de caracteres Retorna um valor de cadeia de caracteres atualizado quando um novo progresso está disponível ou o mesmo valor que o parâmetro nextToken se não houver atualizações.

Exemplo de uso do método

ClientResult result = context.Site.GetMigrationJobProgress(jobId, nextToken ?? "0");
context.ExecuteQuery();
IList logs = result.Value.Logs;
string newNextToken = result.Value.NextToken;

GetMigrationJobProgress REST API

Solicitação HTTP

GET https://{site_url}/_api/site/GetMigrationJobProgress(jobId='{jobId}',nextToken=0)

Parâmetros de URI

Nome Tipo Obrigatório Descrição
jobId Guid Sim Identificador exclusivo do trabalho de migração
nextToken Cadeia de caracteres Sim Token para posição de paginação. Use "0" para solicitação inicial

Cabeçalhos de solicitação

Cabeçalho Obrigatório
Autorização: Portador {token} Sim
Aceitar: application/json; odata=verbose Sim

Resposta

Um objeto JSON quando o código de status HTTP é 200.

Um objeto JSON vazio quando o código de status HTTP é diferente de 200.

Tratamento de Erros

Código de status Significado Ação
403 Não Autorizado (Unauthorized) Certifique-se de que o aplicativo/usuário tenha pelo menos as permissões Sites.Read.All.
429 Muitos Pedidos (Too Many Requests) Analise Retry-After cabeçalho e tente novamente após o atraso especificado.
500 Erro Interno do Servidor (Internal Server Error) Analise as respostas de erro para identificar erros internos. Não tente novamente.
503 Serviço Indisponível (Service Unavailable) Analise Retry-After cabeçalho e tente novamente após o atraso especificado.
Código de erro interno Significado
-2147213145 Trabalho não encontrado
-2147213146 O status do trabalho expirou (válido por menos de 5 dias)

Exemplo de uso da API

Solicitar Amostra

GET https://contoso.sharepoint.com/_api/site/GetMigrationJobProgress(jobId=' 3e280efa-78a3-4ba1-bac6-e447aa538ca5', nextToken=0)

Exemplo de resposta bem-sucedida

Código de status: 200 Corpo da resposta:

{
  "d": {
    "GetMigrationJobProgress": {
      "Logs": {
        "__metadata": {
          "type": "Collection(Edm.String)"
        },
        "results": [
          "{\"MigrationType\":\"None\",\"MigrationDirection\":\"Import\",\"SiteId\":\"48f1898f-77d9-4a1b-bddc-1f49bb6dc134\",\"DbId\":\"de6b85cd-726e-4b13-ae04-629798fddbf3\",\"TotalRetryCount\":\"0\",\"JobId\":\"3e280efa-78a3-4ba1-bac6-e447aa538ca5\",\"Time\":\"05/20/2025 09:18:48.132\",\"CorrelationId\":\"91884a0c-5ee8-4e1f-a23f-e4f7ec170182\",\"Event\":\"JobQueued\"}",
          "{\"MigrationType\":\"None\",\"MigrationDirection\":\"Import\",\"SiteId\":\"48f1898f-77d9-4a1b-bddc-1f49bb6dc134\",\"WebId\":\"7206fc09-e4af-48b3-8730-ed7321396d7a\",\"DbId\":\"de6b85cd-726e-4b13-ae04-629798fddbf3\",\"FarmId\":\"f77d7b6c-ef43-4609-8fce-0e93142ce8a0\",\"ServerId\":\"44af885c-393b-4236-9417-bae7a9edc44e\",\"SubscriptionId\":\"82abb045-250e-4186-ba83-b9295930f272\",\"TotalRetryCount\":\"0\",\"JobId\":\"3e280efa-78a3-4ba1-bac6-e447aa538ca5\",\"Time\":\"05/20/2025 09:20:51.129\",\"CorrelationId\":\"7d3e7a8e-4445-4ce0-adb1-078e78cbf686\",\"Event\":\"JobStart\"}",
          "{\"MigrationType\":\"None\",\"MigrationDirection\":\"Import\",\"TotalRetryCount\":\"0\",\"ObjectType\":\"ListItem\",\"Url\":\"\",\"Id\":\"cb471d5f-593f-4a63-b59e-8eae3e35b08a\",\"SourceListItemIntId\":\"3\",\"TargetListItemIntId\":\"3\",\"ErrorCode\":\"-2147286782\",\"ErrorType\":\"Microsoft.SharePoint.SPException\",\"Message\":\"Attempted to use an object that has ceased to exist. (Exception from HRESULT: 0x80030102 (STG_E_REVERTED)) \",\"JobId\":\"3e280efa-78a3-4ba1-bac6-e447aa538ca5\",\"Time\":\"05/20/2025 09:20:55.490\",\"CorrelationId\":\"7d3e7a8e-4445-4ce0-adb1-078e78cbf686\",\"Event\":\"JobError\"}",
          "{\"MigrationType\":\"None\",\"MigrationDirection\":\"Import\",\"TotalRetryCount\":\"0\",\"FilesCreated\":\"0\",\"BytesProcessed\":\"0\",\"ObjectsProcessed\":\"4\",\"TotalExpectedSPObjects\":\"15\",\"TotalErrors\":\"3\",\"TotalWarnings\":\"0\",\"WaitTimeOnSqlThrottlingMilliseconds\":\"0\",\"TotalDurationInMs\":\"0\",\"CpuDurationInMs\":\"0\",\"SqlDurationInMs\":\"0\",\"SqlQueryCount\":\"0\",\"IsShallowCopy\":\"False\",\"CreatedOrUpdatedFileStatsBySize\":\"{}\",\"ObjectsStatsByType\":\"{\\\"SPUser\\\":{\\\"Count\\\":1,\\\"TotalTime\\\":124,\\\"AccumulatedVersions\\\":0,\\\"ObjectsWithVersions\\\":0},\\\"SPFolder\\\":{\\\"Count\\\":1,\\\"TotalTime\\\":153,\\\"AccumulatedVersions\\\":0,\\\"ObjectsWithVersions\\\":0},\\\"SPDocumentLibrary\\\":{\\\"Count\\\":1,\\\"TotalTime\\\":404,\\\"AccumulatedVersions\\\":0,\\\"ObjectsWithVersions\\\":0},\\\"SPFile\\\":{\\\"Count\\\":1,\\\"TotalTime\\\":0,\\\"AccumulatedVersions\\\":0,\\\"ObjectsWithVersions\\\":0},\\\"SPListItem\\\":{\\\"Count\\\":1,\\\"TotalTime\\\":1880,\\\"AccumulatedVersions\\\":0,\\\"ObjectsWithVersions\\\":0}}\",\"TotalExpectedBytes\":\"0\",\"FilesCreatedIrrespectiveOfVersions\":\"0\",\"BytesProcessedOnlyCurrentVersion\":\"0\",\"JobId\":\"3e280efa-78a3-4ba1-bac6-e447aa538ca5\",\"Time\":\"05/20/2025 09:20:57.380\",\"CorrelationId\":\"7d3e7a8e-4445-4ce0-adb1-078e78cbf686\",\"Event\":\"JobEnd\"}"
        ]
      },
      "NextToken": "1764",
      "__metadata": {
        "type": "SP.MigrationJobProgress"
      }
    }
  }
}

Exemplo de resposta de erro

Código do status: 500 Corpo da resposta:

{
  "error": {
    "code": "-2147213145, Microsoft.SharePoint.SPException",
    "innererror": {
      "message": "Job not found",
      "stacktrace": "STACK_TRACE"
    },
    "message": {
      "lang": "en-US",
      "value": "Job not found"
    }
  }
} 

Prática Recomendada

Comece com nextToken=0, armazene o token retornado e pesquise em determinados intervalos. Esse método é adequado para trabalhos de longa duração e ajuda a garantir que nenhuma atualização seja perdida.

Como os trabalhos de migração normalmente levam vários minutos ou mais, é recomendável pesquisar a cada minuto, respeitando a diretriz para evitar limitação.

Confira também