我已经在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。
答案 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。
我希望这可能有用。