Загрузка нескольких файлов в Sharepoint с помощью CSOM приводит к SocketException

Я использую клиентскую объектную модель на C# для Sharepoint2010 в течение нескольких недель и пытался загружать файлы с помощью File.SaveBinaryDirect, добавляя файл в список и затем вызывая ExecuteQuery. Оба метода успешны, когда я просто загружаю всего несколько файлов размером ‹= 3 МБ.

Однако, скажем, я пытаюсь загрузить 10 000 файлов по 10 КБ каждый с помощью SaveBinaryDirect, это не удается с SocketException (адрес уже используется). Он вызывается примерно 2000 раз, прежде чем выдает это исключение, поэтому похоже, что он использует все порты до того, как Time_wait закончит ожидание своих 240 секунд по умолчанию.

С методом ExecuteQuery это работает, но только потому, что я загружаю их в пакетном режиме, причем размер одного пакета всегда меньше 3 МБ и загружается не более 20 файлов одновременно. Таким образом, этот метод также имеет ограничения: он не может загружать файлы размером более 3 МБ, а также существует риск возникновения исключения SocketException. При 10 000 файлов метод вызывается только 500 раз. Я предполагаю, что при большем количестве загружаемых файлов метод будет вызываться более 2000 раз и выдавать ту же ошибку, что и метод SaveBinaryDirect.

Теперь я не знаю, как устранить ошибку SocketException в CSOM. Кто-нибудь знает, как это решить?

Что я мог бы сделать, так это попытаться поймать, и каждый раз, когда я ловлю это конкретное исключение, я жду 4 минуты, прежде чем снова загружать файлы. Еще я мог бы реализовать веб-клиент с сокетом, используя параметры REUSE_ADDRESS, но я не уверен, что буду тратить свое время впустую, к тому же я действительно не эксперт в этом вопросе.

OR

Кто-нибудь знает надежный способ загрузки любого количества файлов разного размера (хотя они всегда должны быть меньше максимального размера загрузки по умолчанию, равного 50 МБ) в Sharepoint? Или какие API для Sharepoint2010 могут дать мне такую ​​возможность? Можно ли вообще начать?

Вероятно, я попытаюсь использовать службу WebCopy.asmx и/или службу WCF listdata.svc, но я не уверен, что смогу добиться большего успеха ни с одной из этих служб. Они очень похожи на использование Client.svc через CSOM.


person gdube    schedule 05.06.2013    source источник


Ответы (1)


Итак, вот как HttpWebRequest будет пытаться повторно использовать одно и то же соединение, хотя кажется, что этот метод не полностью безопасен:

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

Установка ConnectionGroupName не является обязательной. Дополнительную информацию можно найти здесь.

Вы можете получить доступ к WebRequest в CSOM, и вот где:

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

Просто сначала убедитесь, что у вас есть PendingRequest.

Я надеюсь, что это может быть полезно.

person gdube    schedule 18.06.2013