2013-06-05 4 views
0

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

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

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

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

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

ИЛИ

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

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

ответ

0

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

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

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

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

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

Просто убедитесь, что у PendingRequest первым.

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