19

我有指向 sharepoint 2013 Office 365 的 Web 服务。我使用客户端对象模型。我正在尝试更新其中存储 4 个附件的 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();
4

4 回答 4

26

SharePoint 对 CSOM 有自己的限制。不幸的是,这些限制不能在管理中心配置,也不能使用 CSOM 设置,原因很明显。

在谷歌上搜索该问题时,通常通过将ClientRequestServiceSettings.MaxReceivedMessageSize属性设置为所需大小来提供解决方案。

从 SharePoint 命令行管理程序调用以下 PowerShell 脚本:

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

这会将限制设置为 200 MB。

但是,在 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()  

希望能省去一些人的头疼!

于 2014-07-11T07:28:58.567 回答
6

我刚刚在 SharePoint 2013 中遇到了这个问题,在查看了它指出的文档之后:

FileCreationInformation类的内容属性。可以上传的最大文件大小为 2 MB。超时发生在 30 分钟后。仅用于上传小于 2 MB 的文件。

但是,如果您设置该ContentStream属性,则不会达到相同的文档大小限制。该文档指出:

FileCreationInformation类的ContentStream属性。没有文件大小限制。超时发生在 30 分钟后。推荐用于: - SharePoint Server 2013。 - 文件小于 10 MB 时的 SharePoint Online。

文档中还详细介绍了其他一些选项,但希望这会帮助遇到同样问题的其他人。

于 2016-10-12T09:52:19.447 回答
4

使用 .ContentStream 而不是 .Content

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


newFile.ContentStream = new MemoryStream(System.IO.File.ReadAllBytes(file));
于 2020-04-13T17:31:21.250 回答
4

早些时候我使用这种方法并遇到 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;
于 2019-07-04T13:02:07.197 回答