使用CSOM将多个文件上载到Sharepoint会导致SocketException

时间:2013-06-05 20:19:13

标签: c# sharepoint-2010 csom

我已经在C#for Sharepoint2010中使用客户端对象模型几周了,我尝试使用File.SaveBinaryDirect上传文件,并将文件添加到列表中,然后调用ExecuteQuery。当我只上传一些大小<= 3 MB的文件时,这两种方法都很成功。

但是,假设我尝试使用SaveBinaryDirect上传10,000个10KB的文件,它会因SocketException(地址已被使用)而失败。它在抛出此异常之前被调用了2000次,因此在任何Time_wait完成等待其默认240秒之前,它看起来像是用完所有端口。

使用ExecuteQuery方法,它可以工作,但只是因为我批量上传它们,一个批处理的大小总是低于3 MB,并且一次上传的文件不会超过20个。所以这个方法也有局限性:它不能上传超过3 MB的文件,而且还有抛出SocketException的风险。使用10,000个文件时,该方法仅被调用500次。我猜想要上传大量文件,该方法也会调用超过2000次并抛出与SaveBinaryDirect方法相同的错误。

现在,我不知道如何解决CSOM中的SocketException错误。有谁知道如何解决它?

我能做的就是试一试,每当我抓到这个特定的异常时,我等待4分钟再重新上传文件。我可以做的另一件事是使用REUSE_ADDRESS选项实现一个带套接字的Web客户端,但我不确定我是否会浪费时间,而且我真的不是这方面的专家。

OR

有没有人知道一种可靠的方法来上传任意数量的不同大小的文件(尽管它们必须始终在默认的最大上传大小50 MB下)到Sharepoint?或者Sharepoint2010的哪些API可以为我提供这种可能性?甚至可以开始吗?

我可能会尝试使用服务WebCopy.asmx和/或WCF服务listdata.svc,但我不确定这些服务是否会成功。它们看起来非常类似于通过CSOM使用Client.svc。

1 个答案:

答案 0 :(得分:0)

所以这里是HttpWebRequest将如何继续重用相同的连接,尽管看起来这种方法并不完全安全:

        HttpWebRequest request = (HttpWebRequest)WebRequest.CreateRequest(url);
        request.ConnectionGroupName = CONN_GROUP_NAME;
        request.UnsafeAuthenticatedConnectionSharing = true;

设置ConnectionGroupName是可选的。您可以寻求更多信息here

您可以在CSOM中访问WebRequest,这里是:

        ClientContent ctx = new ClientContext(siteUrl);
        ctx.PendingRequest.RequestExecutor.WebRequest.UnsafeAuth...

请务必先找到PendingRequest。

我希望这可能有用。