SharePoint错误:服务器不允许大于2097152字节的邮件

时间:2013-09-17 23:14:17

标签: sharepoint sharepoint-2013 csom

我的网络服务指向sharepoint 2013 Office 365.我使用客户端对象模型。我正在尝试更新存储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 个答案:

答案 0 :(得分:21)

SharePoint对CSOM有自己的限制。遗憾的是,无法在管理中心中配置这些限制,并且由于显而易见的原因也无法使用CSOM进行设置。

在Google上搜索问题时,通常会将ClientRequestServiceSettings.MaxReceivedMessageSize属性设置为所需的大小,从而提供解决方案。

从SharePoint Management 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()  

希望能让一些人头疼!

答案 1 :(得分:4)

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

  

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

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

   FileCreationInformation 类上的

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

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

答案 2 :(得分:3)

使用.ContentStream代替.Content

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


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

答案 3 :(得分:1)

之前,我使用这种方法并遇到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;