SharePoint错误:服务器不允许大于2097152字节的消息。

22

我有一个指向SharePoint 2013 Office 365的Web服务,使用客户端对象模型。我试图更新存储在其中的四个附件的XML文件。当我在XML文件中有大的二进制数据时进行此操作,会出现以下错误:

信息:

请求消息太大。服务器不允许大于2097152字节的消息。

我意识到我可能需要将附件从XML文件中分离出来,但目前我的InfoPath表单将它们存储在那里。有没有办法可以增加请求长度或者分块保存之类的操作?我只是想修改一个节点,但是如果我不更新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();

我通过使用文件保存二进制直接来避免了大小问题,这里有一个很好的例子,它被成功地使用了。 - Roskow
4个回答

28

SharePoint在CSOM方面有其自己的限制。不幸的是,这些限制无法在中央管理中配置,也无法使用CSOM进行设置,原因显而易见。

搜索此问题时,通常的解决方案是将ClientRequestServiceSettings.MaxReceivedMessageSize属性设置为所需大小。

从SharePoint管理Shell调用以下PowerShell脚本:

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

这将把限制设置为200 MB。

然而,在SharePoint 2013中,微软显然添加了另一个配置设置,以限制服务器从CSOM请求中处理的数据量(为什么有人会不同地配置这个是超出我的理解范围...)。在阅读了非常非常长的SharePoint日志文件并浏览了一些反编译的SharePoint服务器代码之后,我发现可以通过属性ClientRequestServiceSettings.MaxParseMessageSize来设置此参数。

我们现在正在使用以下脚本与SharePoint 2013,并且它运行得很好:

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

希望这能帮助一些人省下不少麻烦!


我需要停止Sharepoint计时器服务,输入上述脚本,然后重新启动服务,才能使其正常工作。 - Erwin
@Erwin 我不记得曾经需要这样做。但我想这只是在使用SharePoint时必须接受的看似随机的行为。无论如何,感谢您的反馈。 - helb
谢谢!你帮我省了好几个小时的功夫! :) - Shahab
谢谢!!!不确定为什么MaxParseMessageSize没有被广泛记录...向你致敬,因为你找到了这个解决方法...它对我完美地起作用了... - nivensookharan
对于任何需要还原此更改的人,我们的情况是,SPS2013中两个属性的默认值都为0。 - Dani Rodríguez

9

我刚在SharePoint 2013中遇到了这个问题,在查看文档后,它说明:

FileCreationInformation类上的Content属性。可上传的最大文件大小为2MB。30分钟后超时。仅用于上传小于2MB的文件。

但是,如果您设置ContentStream属性,则不会遇到相同的文档大小限制。文档说明如下:

FileCreationInformation类上的ContentStream属性。没有文件大小限制。30分钟后超时。建议使用: - SharePoint Server 2013。 - SharePoint Online,当文件小于10 MB时。

文档还详细介绍了一些其他选项,但希望这将有助于遇到此问题的其他人。


6

之前我使用这种方法,在处理2MB的文件时出现了问题。

var fileCreationInfo = new FileCreationInformation
                    {

                        Content = System.IO.File.ReadAllBytes(fileName),
                        Overwrite = true,
                        Url = Path.GetFileName(fileName)
                   };

我尝试使用PowerShell脚本来增加文件大小限制,但没有成功。后来我按照以下方法操作,成功上传了100MB大小的文件。
FileStream fs = new FileStream(fileName, FileMode.Open);
                FileCreationInformation fileCreationInfo = new FileCreationInformation();
                fileCreationInfo.ContentStream = fs;
                fileCreationInfo.Url = Path.GetFileName(fileName);
                fileCreationInfo.Overwrite = true;

5

使用.ContentStream而不是.Content

 //newFile.Content = System.IO.File.ReadAllBytes(file);


newFile.ContentStream = new MemoryStream(System.IO.File.ReadAllBytes(file));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接