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

本文关键字:Sharepoint SocketException 文件 CSOM 使用 | 更新日期: 2023-09-27 18:17:01

我已经在Sharepoint2010中使用c#客户端对象模型几个星期了,我试过用File上传文件。SaveBinaryDirect,并将文件添加到列表中,然后调用ExecuteQuery。当我只上传几个大小为<= 3mb的文件时,这两种方法都成功了。

然而,假设我尝试使用SaveBinaryDirect上传10,000个10KB的文件,它会因SocketException(地址已经在使用中)而失败。在抛出这个异常之前,它被调用了大约2000次,所以看起来在Time_wait完成默认的240秒等待之前,它用光了所有的端口。

使用ExecuteQuery方法,它可以工作,但只是因为我批量上传它们,一个批量的大小总是小于3 MB,并且一次上传的文件不超过20个。所以这种方法也有限制:它不能上传超过3 MB的文件,而且它也有抛出SocketException的风险。对于10,000个文件,该方法只被调用500次。我猜,如果要上传的文件数量更大,该方法也将被调用2000多次,并抛出与SaveBinaryDirect方法相同的错误。

现在,我不知道如何解决SocketException错误在CSOM。有人知道怎么解决吗?

我能做的是一个try-catch,每次我捕获这个特定的异常,我等待4分钟再上传文件。我可以做的另一件事是使用REUSE_ADDRESS选项实现一个带有套接字的Web客户端,但我不确定我是否在浪费时间,而且我真的不是这方面的专家。

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

我可能会尝试WebCopy服务。asmx和/或WCF服务列表数据。svc,但我不确定这两种服务是否还能成功。它们看起来与Client的用法非常相似。

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

所以这里是HttpWebRequest将尝试保持重用相同的连接,虽然它似乎是不完全安全的方法:

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

ConnectionGroupName是可选的。你可以点击这里查看更多信息。

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

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

确保先有一个PendingRequest。