0

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

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

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

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

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

或者

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

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

4

1 回答 1

1

所以这里是 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 即可。

我希望这可能有用。

于 2013-06-18T19:00:49.740 回答