2013-02-25 66 views
4

我试图将附件添加到我刚刚在使用CAML的Sharepoint服务器上创建的列表项。下面的代码被简化了(例如路径通常是一个变量,而第二个字段(这里的项目id,这里是16847)通常是我从CAML的insert语句中得到的id)。Lists.AddAttachment抛出对象引用错误

这是我的代码:

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是需要的列表,16847是添加附件的任务ID。

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

我也尝试了一个http放(明显未经授权的访问)和复制服务(如果我们找不到上述更简单的方法的解决方案,我可以发布此代码)。

谁能告诉我什么是错的?

编辑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

+0

什么是初始化列表? GetData是做什么的?例外是否给出了行号? – 2013-02-25 14:43:30

+0

和你的'GetData'方法中的* code *?请注意,您应该将这些信息编辑到您的问题中,而不是将其添加到评论中。 – 2013-02-25 14:53:41

+0

好的谢谢,这是我的第一篇文章 – 2013-02-25 14:58:44

回答

2

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

相关问题