使用Web服务将文档上载到Sharepoint 2013 Online

时间:2013-09-16 19:59:53

标签: c# web-services sharepoint-2013

我有一个客户在Sharepoint 2013 Online中实现客户门户。当前程序通过邮件将文档分发给客户。现在我们必须将文档上传到客户门户网站。

我尝试在sharepoint中使用copy webservice。我创建了一个测试项目并将webservice添加为Web Reference并编写了以下测试代码:

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 = "username@outlook.com";
    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,您必须按this帖子中的说明附加Office 365身份验证Cookie。 然而,我的问题是还涉及ADFS。我如何验证ADFS?

2 个答案:

答案 0 :(得分:1)

由于验证模式不正确,最有可能发生此错误 由于SharePoint Online(SPO)使用基于声明的身份验证,因此无法在SPO中使用NetworkCredential Class进行身份验证。 要在SPO中对ADFS执行身份验证,您可以使用SharePointOnlineCredentials class中的SharePoint Online Client Components SDK

如何在SharePoint Online(SPO)中验证SharePoint Web服务

以下示例演示了如何检索身份验证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);
 }

参考

答案 1 :(得分:0)

在我的情况下(内部)我有这个错误。当我在Web应用程序的iis SharePoint身份验证中更改时,并禁用“表单身份验证”。现在,我无法通过UI进入SharePoint,但Web服务正常工作......所以我已经恢复并且我一直在寻找...

[Paul stork]此站点的Web应用程序以经典模式而非声明模式运行。如果您使用Powershell创建Web应用程序或从2010年升级,则会发生这种情况。您可以使用PowerShell进行更改。

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

我在管理中心(在同一个服务器场中)创建的另一个新应用程序中尝试了Web服务,并且它已经运行了。问题是网络应用程序。

尝试: http://sharepointyankee.com/2011/01/04/the-request-failed-with-the-error-message-object-moved-sharepoint-2010-web-services-fba/ 扩展混合身份验证Web应用程序,并为Windows身份验证创建一个区域,然后更改Web服务属性中的Web引用URL,以使用该扩展URL和端口。你不应再有这类问题了。