SharePoint GetMigrationJobProgress API

После отправки задания миграции ( будь то задание импорта или задание асинхронного чтения метаданных (AMR) — вы можете использовать API GetMigrationJobProgress для отслеживания его хода выполнения. API доступен через интерфейсы SDK и REST.

Он возвращает последовательность событий состояния задания, включая: JobQueued, JobStart, JobProgress, JobError и JobEnd.

Разрешения

При отправке задания миграции используйте проверку подлинности на основе приложения. Убедитесь, что приложению предоставлено разрешение Sites.Read.All или выше.

Метод GetMigrationJobProgress (SDK)

Синтаксис

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

Параметры метода

Имя Тип Обязательный Описание
jobId GUID Да Уникальный идентификатор задания миграции
nextToken String Да Токен для позиции подкачки. Используйте "0" для первоначального запроса

Для завершенного задания запросы, использующие nextToken, являются идемпотентными. Повторение одного и того же запроса будет последовательно возвращать один и тот же результат.

Возвращаемые значения

Имя Тип Описание
Журналы IList Возвращает коллекцию событий состояния задания, когда доступен новый ход выполнения, или пустую коллекцию, если обновления отсутствуют.
NextToken String Возвращает обновленное строковое значение при наличии нового хода выполнения или то же значение, что и параметр nextToken, если обновления отсутствуют.

Пример использования метода

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

GetMigrationJobProgress REST API

HTTP-запрос

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

Параметры URI

Имя Тип Обязательный Описание
jobId GUID Да Уникальный идентификатор задания миграции
nextToken String Да Токен для позиции подкачки. Используйте "0" для первоначального запроса

Заголовки запроса

Заголовок Обязательный
Авторизация: носитель {token} Да
Принять: application/json; odata=verbose Да

Отклик

Объект JSON, если код состояния HTTP равен 200.

Пустой объект JSON, если код состояния HTTP отличается от 200.

Обработка ошибок

Код состояния Смысл Действие
403 Не авторизован (Unauthorized) Убедитесь, что у приложения или пользователя есть по крайней мере разрешения Sites.Read.All.
429 Слишком много запросов (Too Many Requests) Выполните синтаксический анализ заголовка Retry-After и повторите попытку после указанной задержки.
500 Внутренняя ошибка сервера (Internal Server Error) Анализ ответов на ошибки для выявления внутренних ошибок. Не повторяйте попытку.
503 Служба недоступна (Service Unavailable) Выполните синтаксический анализ заголовка Retry-After и повторите попытку после указанной задержки.
Код внутренней ошибки Смысл
-2147213145 Задание не найдено
-2147213146 Истек срок действия состояния задания (срок действия менее 5 дней)

Пример использования API

Пример запроса

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

Пример успешного ответа

Код состояния: 200 Текст ответа:

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

Пример ответа на ошибку

Код состояния: 500 Текст ответа:

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

Рекомендация

Начните с nextToken=0, сохраняйте возвращенный токен и опрашиваете через определенные промежутки времени. Этот метод хорошо подходит для длительных заданий и помогает гарантировать отсутствие пропущенных обновлений.

Так как задания миграции обычно занимают несколько минут или больше, рекомендуется выполнять опрос каждую минуту, придерживаясь этого руководства , чтобы избежать регулирования.

См. также