Загрузить документ в Sharepoint 2013 Online с помощью веб-сервисов

У меня есть клиент, который внедряет клиентские порталы в Sharepoint 2013 Online. Текущая программа рассылает документы клиентам по почте. Теперь нам нужно загрузить документы на клиентский портал.

Я пытаюсь использовать веб-сервис копирования в sharepoint. Я создал тестовый проект, добавил веб-сервис в качестве веб-ссылки и написал следующий тестовый код:

static void Main(string[] args)
{
    string baseUrl = "https://mycustomer.sharepoint.com/sites/";
    string customer = "customerportalname";
    string serviceUrl = "/_vti_bin/copy.asmx";
    string destinationDirectory = "/folder/";
    string fileName = "uploaded.xml";

    string username = "[email protected]";
    string password = "password";

    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.LoadXml("<fiets><onderdeel>voorwiel</onderdeel><onderdeel>achterwiel</onderdeel><onderdeel>trappers</onderdeel><onderdeel>stuur</onderdeel><onderdeel>frame</onderdeel></fiets>");

    byte[] xmlByteArray;
    using (MemoryStream memoryStream = new MemoryStream())
    {
        xmlDocument.Save(memoryStream);
        xmlByteArray = memoryStream.ToArray();
    }

    string destinationUrl = string.Format("{0}{1}{2}{3}", baseUrl, customer, destinationDirectory, fileName);
    string[] destinationUrlArray = new string[] { destinationUrl };

    FieldInformation fieldInfo = new FieldInformation();
    FieldInformation[] fields = { fieldInfo };


    CopyResult[] resultsArray;

    using (Copy copyService = new Copy())
    {
        copyService.PreAuthenticate = true;
        copyService.Credentials = new NetworkCredential(username, password);
        copyService.Url = string.Format("{0}{1}", baseUrl, serviceUrl);

        copyService.Timeout = 600000;

        uint documentId = copyService.CopyIntoItems(destinationUrl , destinationUrlArray, fields, xmlByteArray, out resultsArray);
    }
} 

Когда я выполняю код, я получаю следующую ошибку:

The request failed with the error message:
--
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/_forms/default.aspx?ReturnUrl=%2f_vti_bin%2fcopy.asmx">here</a>.</h2>
</body></html>
--

Похоже, я не аутентифицирован и меня перенаправляют. Однако учетные данные верны. У кого-нибудь есть идея? Заранее спасибо!

ОБНОВЛЕНИЕ

Чтобы иметь возможность подключиться к SharePoint 2013 Online, необходимо прикрепить файлы cookie для проверки подлинности Office 365, как описано в этот пост. Однако моя проблема заключается в том, что также задействована ADFS. Как я могу пройти аутентификацию в ADFS?


person DirkV    schedule 16.09.2013    source источник
comment
Вы пришли в нужное место, чтобы спросить об этом. Но позвольте мне также предложить дочерний сайт Stack Overflow, так как он больше ориентирован на Sharepoint: sharepoint.stackexchange.com   -  person Geeky Guy    schedule 17.09.2013
comment
Вы заставили это работать? Мне очень интересно увидеть ваше решение. У меня такая же дилемма.   -  person monkeyjumps    schedule 14.08.2014


Ответы (2)


Эта ошибка, скорее всего, возникает из-за неправильного режима проверки подлинности.
Поскольку SharePoint Online (SPO) использует проверку подлинности на основе утверждений, NetworkCredential Class нельзя использовать для аутентификации в SPO. Чтобы выполнить аутентификацию в ADFS в SPO, вы можете использовать Класс SharePointOnlineCredentials из SDK клиентских компонентов SharePoint Online.

Как аутентифицировать веб-службы SharePoint в SharePoint Online (SPO)

В следующем примере показано, как получить файлы cookie для проверки подлинности:

private static CookieContainer GetAuthCookies(Uri webUri, string userName, string password)
{
    var securePassword = new SecureString();
    foreach (var c in password) { securePassword.AppendChar(c); }
    var credentials = new SharePointOnlineCredentials(userName, securePassword);
    var authCookie = credentials.GetAuthenticationCookie(webUri);
    var cookieContainer = new CookieContainer();
    cookieContainer.SetCookies(webUri, authCookie);
    return cookieContainer;
}

Пример

string sourceUrl = "https://contoso.sharepoint.com/Documents/SharePoint User Guide.docx";
string destinationUrl = "https://contoso.sharepoint.com/Documents/SharePoint User Guide 2013.docx";
FieldInformation[] fieldInfos;
CopyResult[] result;
byte[] fileContent;
using(var proxyCopy = new Copy())
{
     proxyCopy.Url = webUri + "/_vti_bin/Copy.asmx";
     proxyCopy.CookieContainer = GetAuthCookies(webUri, userName, password);

     proxyCopy.GetItem(sourceUrl,out fieldInfos,out fileContent);
     proxyCopy.CopyIntoItems(sourceUrl,new []{ destinationUrl}, fieldInfos, fileContent, out result);
 }

использованная литература

person Vadim Gremyachev    schedule 18.02.2015
comment
Привет Вадим. Я успешно загружаю файлы, но при загрузке больших файлов я получаю сообщение об ошибке тайм-аута операции. Знаете ли вы, как увеличить тайм-аут в веб-службе? - person SP Developer; 06.10.2016

В моем случае (на предпосылке) у меня есть эта ошибка. когда я изменил аутентификацию iis SharePoint для веб-приложения и отключил «Аутентификацию форм». Теперь я не могу войти в SharePoint через пользовательский интерфейс, но веб-служба работает... Итак, я вернулся, искал и...

[Пол сторк] Веб-приложение для этого сайта работает в классическом режиме, а не в режиме претензий. Это может произойти, если вы создаете веб-приложение с помощью Powershell или выполняете обновление с версии 2010. Вы можете использовать PowerShell, чтобы изменить его.

http://technet.microsoft.com/en-us/library/gg251985.aspx

Я попробовал веб-службу в другом новом приложении, созданном пользовательским интерфейсом в центре администрирования (в той же ферме), и это сработало. Проблема была в веб-приложении.

Чтобы попробовать: http://sharepointyankee.com/2011/01/04/the-request-failed-with-the-error-message-object-moved-sharepoint-2010-web-services-fba/ Расширьте веб-приложение смешанной аутентификации и создайте зону только для аутентификации Windows, затем измените URL-адрес веб-ссылки в свойствах веб-службы, чтобы использовать этот расширенный URL-адрес и порт. У вас больше не должно быть таких проблем.

person Miguel Ángel Morillo    schedule 20.03.2015