Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
После отправки задания миграции ( будь то задание импорта или задание асинхронного чтения метаданных (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, сохраняйте возвращенный токен и опрашиваете через определенные промежутки времени. Этот метод хорошо подходит для длительных заданий и помогает гарантировать отсутствие пропущенных обновлений.
Так как задания миграции обычно занимают несколько минут или больше, рекомендуется выполнять опрос каждую минуту, придерживаясь этого руководства , чтобы избежать регулирования.