Клиентская объектная модель Sharepoint 2010 - загрузить документ (конфликт 409)

Я использую клиентскую объектную модель SP2010 для загрузки в библиотеку документов, следуя указаниям Microsoft здесь: http://msdn.microsoft.com/en-us/library/ee956524.aspx

Я сталкиваюсь с кодом состояния HTTP 409 (конфликт) при выполнении следующего кода.

var clientContext = new ClientContext("http://myservername/sites/subsitename") { Credentials = LogonCredentials };
using (var fileStream = new FileStream(@"C:\Temp\Test.txt", FileMode.Open))
{
       Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, "/MyDocLibraryName/Test_FromClientOM.txt", fileStream, true);
} 

Что я делаю неправильно?

4 ответа

Решение

Проблема заключалась в том, что сайт, на который я загружаю, является дочерним, а не корневым ресурсом sharepoint. Я не знаю, был ли это выбор "дизайна" или нет, но, похоже, вам нужно использовать корень sharepoint для ClientContext, по крайней мере, в этом конкретном случае.

Рабочий код:

var clientContext = new ClientContext("http://myservername") { Credentials = LogonCredentials };
using (var fileStream = new FileStream(@"C:\Temp\Test.txt", FileMode.Open))
{
       Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, "/sites/subsitename/MyDocLibraryName/Test_FromClientOM.txt", fileStream, true);
} 

Я также столкнулся с ошибкой 409 при попытке загрузить файл через объектную модель клиента SharePoint 2010. Убедитесь, что путь, по которому вы загружаете файл, полностью существует. При вызове не будет создано никаких (вложенных) папок. Не имеет значения, подключаете ли вы ClientContext к корневому веб-сайту или напрямую к дочернему сайту, как вы говорите. Просто убедитесь, что вы всегда передаете методу SaveBinaryDirect относительный URL-адрес SPSite того места, куда вы хотите загрузить объект.

Например, если вы подключаете свой ClientContext к http://somesite/sites/subsitename, убедитесь, что вы передаете в SaveBinaryDirect также строку /sites/subsitename/documents/filename.txt, то есть относительно SPSite, а не дочерний сайт, к которому вы подключаетесь, используя ваш ClientContext.

У Soledad Pano есть запись в блоге Ошибка загрузки файла Sharepoint: "Удаленный сервер возвратил ошибку: (409) Conflict", которая помогла мне:

Я понял, что проблема заключалась в названии библиотеки. Он содержал черту, например "My-LibraryName". Когда я переименовал это без черты, это начало работать

В моем случае файл был загружен с помощью SaveBinaryDirect в библиотеку с включенным контролем версий. Если файл не зарегистрирован, любые последующие попытки загрузить более новую версию приведут к ошибке 409. Не забудьте зарегистрироваться после загрузки, когда управление версиями включено.

    var clientContext = (ClientContext)file.Context;
    destinationWebContext.Load(destinationList, d => d.ParentWebUrl);
    destinationWebContext.Load(destinationList, d => d.RootFolder.ServerRelativeUrl);
    clientContext.Load(file, f => f.ServerRelativeUrl);
    clientContext.Load(file, f => f.Name);

    if (clientContext.HasPendingRequest)
       clientContext.ExecuteQueryRetry();

    if (destinationWebContext.HasPendingRequest)
        destinationWebContext.ExecuteQueryRetry();

    var location = string.Format("{1}/{2}", destinationList.ParentWebUrl, destinationList.RootFolder.ServerRelativeUrl, file.Name);
    var fileInfo = File.OpenBinaryDirect(clientContext, file.ServerRelativeUrl);
    File.SaveBinaryDirect(destinationWebContext, location, fileInfo.Stream, overwrite);

    File newFile = destinationWebContext.Web.GetFileByServerRelativeUrl(location);
    newFile.CheckIn("Checked in by provisioning service", Microsoft.SharePoint.Client.CheckinType.MajorCheckIn);
    destinationWebContext.ExecuteQuery();
Другие вопросы по тегам