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