404 Not Found/Ошибки протокола при загрузке исторических версий файлов через C# CSOM в локальной среде SharePoint 2013 [C#

Место общения программистов C#
Anonymous
404 Not Found/Ошибки протокола при загрузке исторических версий файлов через C# CSOM в локальной среде SharePoint 2013 [

Сообщение Anonymous »

Мне нужно загрузить исторические версии документа из локальной библиотеки документов SharePoint 2013 с помощью консольного приложения C#, чтобы я мог перенести их в SharePoint Online вместе со свойствами столбцов в хронологическом порядке.
Хотя загрузка текущей последней версии работает отлично, загрузка более старых исторических версий всегда завершается сбоем.
  • Стандартные методы 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
}
}
}
}
}
}
URL-адрес версии, возвращаемый внутри свойства, соответствует следующему формату макета виртуальной папки:
_vti_history/512/Folder/Doc.docx
Мои конкретные запросы среды:
  • Почему переход к URL-адресу папки абсолютной истории через проверенный HttpClient вызывает ошибку 404 Not Found в SharePoint 2013 локально, даже если токен пути извлекается непосредственно из свойства метаданных URL-адреса версии?
  • Существует ли альтернативная устаревшая структура маршрутизации конечной точки REST или альтернативный метод извлечения потока файлов, доступный в SDK SharePoint 2013 (v15), который позволяет внешнему клиентскому приложению успешно получать двоичные файлы более старых версий?

Вернуться в «C#»