2013-09-17 6 views
6

У меня есть веб-служба, которая указывает на sharepoint 2013 Office 365. Я использую объектную модель клиента. Я пытаюсь обновить xml-файл, который хранит в нем 4 вложения. Когда я делаю это, когда у меня есть большие двоичные данные в файле XML, я получаю следующее сообщение об ошибке:Ошибка SharePoint: сервер не разрешает отправлять сообщения размером более 2097152 байт

Сообщение

The request message is too big. The server does not allow messages larger than 2097152 bytes.

Я понимаю, что я, вероятно, придется отделить вложения из файла XML, но в настоящее время моя инфо-форма хранит их там. Есть ли способ увеличить длину запроса или, может быть, сохранить или что-то еще. Я действительно просто модифицирую один узел, и он не будет работать, если я не обновляю xml. Благодарю . Код ниже.

Мой код:

ListItem docReq = GetDocRequestLight(docRequestID, businessID); 
string fPath = (string)docReq["FileRef"]; 
using (FileInformation fInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(ctx, fPath)) 
{ 
    XmlDocument xmlDoc = new XmlDocument(); 
    xmlDoc.Load(fInfo.Stream); 
    XmlNamespaceManager xmlNameSpaceMgr = new XmlNamespaceManager(xmlDoc.NameTable); 
    xmlNameSpaceMgr.AddNamespace("my", DocReqXmlNameSpace); 

    // Get Parent Node 
    XmlNode node = xmlDoc.SelectSingleNode(GetXPathFromItemKey(velmaKey), xmlNameSpaceMgr); 

    DateTime outDate; 
    bool outBool; 
    if (DateTime.TryParse(newValue, out outDate)) 
     node.InnerText = outDate.ToString("yyyy-MM-dd"); 
    if (Boolean.TryParse(newValue, out outBool)) 
     node.InnerText = newValue; 

    // Update Statuses 
    XmlNode statusIDNode = xmlDoc.SelectSingleNode(DocReqStatusIDFieldXPath, xmlNameSpaceMgr); 
    statusIDNode.InnerText = updatedStatus.ID.ToString(); 
    XmlNode statusNode = xmlDoc.SelectSingleNode(DocReqStatusFieldXPath, xmlNameSpaceMgr); 
    statusNode.InnerText = updatedStatus.Name.ToString(); 

    // Save File 
    docReq.File.SaveBinary(new FileSaveBinaryInformation() 
    { 
     Content = Encoding.UTF8.GetBytes(xmlDoc.OuterXml), 
    }); 

    ctx.ExecuteQuery(); 

ответ

15

SharePoint имеет свои пределы для CSOM. К сожалению, эти ограничения не могут быть сконфигурированы в центральном администрировании и также не могут быть установлены с использованием CSOM по очевидным причинам.

При поиске по проблеме, в основном решение предоставляется путем установки свойства ClientRequestServiceSettings.MaxReceivedMessageSize нужного размера.

Вызов следующий PowerShell сценарий из командной консоли SharePoint:

$ws = [Microsoft.SharePoint.Administration.SPWebService]::ContentService 
$ws.ClientRequestServiceSettings.MaxReceivedMessageSize = 209715200 
$ws.Update() 

Это установит предел до 200 МБ.

Однако, в SharePoint 2013 Microsoft, по-видимому, добавила еще один параметр конфигурации, чтобы также ограничить объем данных, которые сервер должен обрабатывать из запроса CSOM (почему кто-то настраивал бы это по-другому, это вне меня ...). После прочтения очень длинного файла журнала SharePoint и обхода какого-либо дизассемблированного кода сервера SharePoint, я обнаружил, что этот параметр можно установить с помощью свойства ClientRequestServiceSettings.MaxParseMessageSize.

Теперь мы используем следующий скрипт с SharePoint 2013 и он прекрасно работает:

$ws = [Microsoft.SharePoint.Administration.SPWebService]::ContentService 
$ws.ClientRequestServiceSettings.MaxReceivedMessageSize = 209715200 
$ws.ClientRequestServiceSettings.MaxParseMessageSize = 209715200 
$ws.Update() 

Надежда, что спасает некоторым людям головную боль!

+0

Мне нужно было остановить службу таймера Sharepoint, ввести приведенный выше сценарий и снова запустить службу, чтобы эта работа работала. – Erwin

+0

@ Erwin Я не могу вспомнить, что нужно это делать. Но я думаю, что это просто случайное поведение, которое нужно принимать при работе с SharePoint. В любом случае, спасибо за отзывы. – helb

+0

Спасибо! Ты спас мне часы копания! :) – KiNG

2

Я только что столкнулись с этой проблемой в SharePoint 2013 и после того, как просматривал docs говорится:

Content property on the FileCreationInformation class. Maximum file size that can be uploaded is 2 MB. Time-out occurs after 30 minutes. Use to upload files that are less than 2 MB only.

Однако, если вы установите ContentStream свойство, вы не попали в тот же предел размера документа. В документации говорится:

ContentStream property on the FileCreationInformation class. No file size limits. Time-out occurs after 30 minutes. Recommended for: - SharePoint Server 2013. - SharePoint Online when the file is smaller than 10 MB.

Есть и другие варианты, подробно описанные в документации, но, надеюсь, это поможет другим людям, которые столкнулись с этой же самой проблемой.