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

时间:2010-12-06 17:28:46

标签: c# sharepoint-2010 http-status-code-409

我正在使用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);
} 

我做错了什么?

3 个答案:

答案 0 :(得分:8)

这里的问题是我上传的网站是一个子网站,而不是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);
} 

答案 1 :(得分:7)

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

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

答案 2 :(得分:0)

在我的情况下,使用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();