列表.AddAttachment引发对象引用错误

本文关键字:对象引用 错误 AddAttachment 列表 | 更新日期: 2023-09-27 18:00:54

我正在尝试使用CAML向刚刚在sharepoint服务器上创建的列表项添加附件。下面的代码被简化了(例如,路径通常是一个变量,第二个字段(项目id,这里是16847(通常是我从CAML中的insert语句中得到的id(。

这是我的代码:

String desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
String savePath = desktopPath + @"'" + "tutorials.txt";
byte[] data = GetData(savePath);
lists.AddAttachment("Tasks", "16847", "tutorials.txt", data);

我得到这个错误:

无法根据您的更改更新安全性。ItemUpdating期间发生以下异常:对象引用未设置为对象的实例。有关详细信息,请参阅事件查看器。0x81020089

getdata是一种将桌面上的文件转换为byte[]的方法。数据不是空的,看起来还可以。

除此之外,Tasks是所需的List,16847是要在其中添加附件的任务id。

我能找到的大多数信息都是关于一个不同的错误:索引超出范围异常(如msdn页面上的:http://msdn.microsoft.com/en-us/library/lists.lists.addattachment(v=office.12(.aspx(.

我还尝试了http put(显然是未经授权的访问(和复制服务(如果我们找不到上面更简单的方法的解决方案,我可以发布这段代码(。

有人能告诉我怎么了吗?

编辑1:

private dcp.Lists lists = new dcp.Lists(); 
lists.Credentials = System.Net.CredentialCache.DefaultCredentials; 
lists.Url = Values.SERVERADDRESS + "/_vti_bin/lists.asmx"; 

这将初始化与我们的web服务的连接。它非常适合更新、插入。。。

GetData代码:

private byte[] GetData(String savePath)
    {
        byte[] contents;
        using (FileStream fStream = File.OpenRead(savePath))
        {
            contents = new byte[fStream.Length];
            sFileName = fStream.Name;
            fStream.Read(contents, 0, Convert.ToInt32(fStream.Length));
        }
        return contents;
    }

编辑2:

请注意,以下内容确实有效(我从任务中获得了现有附件的正确列表(:

XmlNode ndAttach = lists.GetAttachmentCollection("Tasks", "16847");
MessageBox.Show(ndAttach.OuterXml);

而以下情况则不然(与AddAttachment方法的错误相同(:

lists.DeleteAttachment("Tasks", "16847", ndAttach.ChildNodes[0].InnerText);

尽管我很确定这应该有效,因为它与msdn上的示例代码完全相同:http://msdn.microsoft.com/en-us/library/lists.lists.deleteattachment(v=office.12(.aspx

列表.AddAttachment引发对象引用错误

上面的代码很好,错误发生在我们的服务器上。添加附件时,xml中没有给出内容类型。这被编程为抛出错误,因为我们一直使用这种方法来更新和添加新项目。因此,我们从底层代码中删除了contenttype,它就像一个魅力。