Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.