Хотя загрузка текущей последней версии работает отлично, загрузка более старых исторических версий всегда завершается сбоем.
- Стандартные методы CSOM не работают, поскольку ListItem.Versions не существует в SharePoint 2013 v15 SDK.
- Возврат к прямым конечным точкам HTTP постоянно вызывает ошибку.
System.Net.Http.HttpRequestException: код состояния ответа не указывает на успех: 404 (не найдено).
Ниже приведен минимальный воспроизводимый пример кода, демонстрирующий, как устанавливается соединение. инициализируется, как загружаются свойства и где происходит сбой загрузки в исторических версиях:
Код: Выделить всё
using System;
using System.IO;
using System.Net.Http;
using Microsoft.SharePoint.Client;
using SP = Microsoft.SharePoint.Client;
class Program
{
static void Main()
{
string siteUrl = "https://example.com";
using (ClientContext sourceCtx = new ClientContext(siteUrl))
{
sourceCtx.Credentials = System.Net.CredentialCache.DefaultCredentials;
List sourceList = sourceCtx.Web.Lists.GetByTitle("MyLibrary");
CamlQuery query = CamlQuery.CreateAllItemsQuery();
ListItemCollection items = sourceList.GetItems(query);
sourceCtx.Load(items, ic => ic.Include(
item => item.Id,
item => item.File,
item => item.File.Versions,
item => item.File.ServerRelativeUrl
));
sourceCtx.ExecuteQuery();
foreach (ListItem item in items)
{
if (item.File == null || !item.File.Exists) continue;
foreach (FileVersion ver in item.File.Versions)
{
string absoluteVersionUrl = siteUrl.TrimEnd('/') + "/" + ver.Url.TrimStart('/');
using (var handler = new HttpClientHandler { Credentials = sourceCtx.Credentials })
using (var client = new HttpClient(handler))
{
client.DefaultRequestHeaders.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0");
// CRITICAL FAILURE HERE: Always throws 404 Not Found
HttpResponseMessage response = client.GetAsync(absoluteVersionUrl).Result;
response.EnsureSuccessStatusCode();
using (Stream fileStream = response.Content.ReadAsStreamAsync().Result)
{
// Upload logic to SPO goes here
}
}
}
}
}
}
_vti_history/512/Folder/Doc.docx
Мои конкретные запросы среды:
- Почему переход к URL-адресу папки абсолютной истории через проверенный HttpClient вызывает ошибку 404 Not Found в SharePoint 2013 локально, даже если токен пути извлекается непосредственно из свойства метаданных URL-адреса версии?
- Существует ли альтернативная устаревшая структура маршрутизации конечной точки REST или альтернативный метод извлечения потока файлов, доступный в SDK SharePoint 2013 (v15), который позволяет внешнему клиентскому приложению успешно получать двоичные файлы более старых версий?