Sharepoint 2010 客户端对象模型 - 上传文档(409 冲突)

Posted

技术标签:

【中文标题】Sharepoint 2010 客户端对象模型 - 上传文档(409 冲突)【英文标题】:Sharepoint 2010 Client Object Model - Upload Document (409 Conflict) 【发布时间】:2011-05-21 03:06:10 【问题描述】:

我正在使用 SP2010 客户端对象模型上传到文档库,遵循 Microsoft 此处的提示:http://msdn.microsoft.com/en-us/library/ee956524.aspx#SP2010ClientOMOpenXml_Uploading

在执行以下代码时,我遇到了 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);
 

我做错了什么?

【问题讨论】:

【参考方案1】:

这里的问题是我上传到的站点是一个子站点,而不是 sharepoint 的根。我不知道这是否是“设计”选择,但似乎您必须为 ClientContext 使用 sharepoint 的根,至少在这种特殊情况下是这样。

工作代码:

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);
 

【讨论】:

【参考方案2】:

在尝试通过 SharePoint 2010 客户端对象模型上传文件时,我也遇到了 409 错误。确保您将文件上传到完全的路径存在。该调用不会创建任何(子)文件夹。正如您所说,您是将 ClientContext 连接到根子网站还是直接连接到子网站都没有关系。只需确保您始终向 SaveBinaryDirect 方法提供要上传到的位置的 SPSite 相对 URL。

例如,如果您将 ClientContext 连接到 http://somesite/sites/subsitename,请确保将字符串 /sites/subsitename/documents/filename.txt 也传递给 SaveBinaryDirect,因此相对于 SPSite 而不是您的子站点重新连接到使用您的 ClientContext。

【讨论】:

【参考方案3】:

Soledad Pano 有一个博客条目Sharepoint Upload File Error: ‘The remote server returned an error: (409) Conflict’,这对我有帮助:

我发现问题出在库名上。它上面有一个破折号,例如“My-LibraryName”。当我在没有破折号的情况下重命名它时,它开始工作

【讨论】:

非常感谢。这也是我的情况的确切问题。绝对节省了我一些时间。【参考方案4】:

在我的例子中,文件是使用 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();

【讨论】:

以上是关于Sharepoint 2010 客户端对象模型 - 上传文档(409 冲突)的主要内容,如果未能解决你的问题,请参考以下文章

SharePoint 2010 - 客户端对象模型 - 将附件添加到 ListItem

SharePoint 2010客户端对象模型 - 需要代理身份验证

使用客户端对象模型 SharePoint 2010 以编程方式获取 ListItemVersion

SharePoint 2010 - 客户端对象模型 - 向ListItem添加附件

检查列表列是否存在使用SharePoint客户端对象模型?

SharePoint Server 对象模型(SPSite 和 SPWeb)