Я использую клиентскую объектную модель на 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.