我正在尝试将附件添加到我刚刚使用 CAML 在共享点服务器上创建的列表项。下面的代码被简化了(例如,路径通常是一个变量,第二个字段(项目 id,这里是 16847)通常是我从 CAML 中的插入语句返回的 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 是一种将我桌面上的文件转换为字节 [] 的方法。数据不为空,看起来还可以。
除此之外,Tasks 是所需的列表,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 服务的连接。它非常适合更新、插入...
获取数据代码:
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);
Whereas I'm quite certain this should work since it does exactly the same as the example code on msdn: http://msdn.microsoft.com/en-us/library/lists.lists.deleteattachment(v=office.12).aspx